动态生成 UI
1. 创建UI
1.1 窗口样式创建
Qt::WindowType 是 Qt 框架中用于定义窗口行为和外观的枚举类型,通过设置不同的标志(Flag),可以控制窗口的样式、模态性、父窗口关系等。
核心分类
//窗口类型标识
Qt::Window // 独立窗口(默认有标题栏和边框)
Qt::Dialog // 对话框窗口(通常无边框,有关闭按钮)
Qt::Sheet // macOS 风格的工作表窗口
Qt::Drawer // macOS 风格的抽屉窗口
Qt::Popup // 弹出窗口(无边框,点击外部自动关闭)
Qt::Tool // 工具窗口(标题栏更简洁)
Qt::ToolTip // 工具提示窗口(无边框,无焦点)
Qt::SplashScreen // 启动画面(无边框,无按钮)
Qt::Desktop // 桌面窗口
Qt::SubWindow // 子窗口(如 MDI 应用中的内部窗口)
//窗口提示标志
Qt::WindowTitleHint // 显示标题栏
Qt::WindowSystemMenuHint // 显示系统菜单
Qt::WindowMinimizeButtonHint // 显示最小化按钮
Qt::WindowMaximizeButtonHint // 显示最大化按钮
Qt::WindowCloseButtonHint // 显示关闭按钮
Qt::WindowContextHelpButtonHint // 显示帮助按钮
Qt::WindowStaysOnTopHint // 窗口始终置顶
Qt::WindowStaysOnBottomHint // 窗口始终置底
Qt::CustomizeWindowHint // 自定义窗口装饰(需配合其他标志)
//特殊行为标志
Qt::FramelessWindowHint // 无边框窗口
Qt::WindowFullscreen // 全屏窗口
Qt::WindowMaximized // 最大化窗口
Qt::WindowMinimized // 最小化窗口
Qt::WindowShadeButtonHint // 显示阴影按钮(用于折叠窗口)
Qt::WindowTransparentForInput // 窗口不接收输入事件
Qt::WindowOverridesSystemGestures // 覆盖系统手势
使用
- 窗口构造时设置
#include <QDialog>
class MyDialog : public QDialog {
public:
MyDialog(QWidget *parent = nullptr) : QDialog(parent) {
// 设置为无边框的弹出窗口
setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
}
};
- 动态修改窗口标志
// 切换为全屏模式
void setFullscreen(bool fullscreen) {
if (fullscreen) {
setWindowFlags(windowFlags() | Qt::WindowFullscreen);
} else {
setWindowFlags(windowFlags() & ~Qt::WindowFullscreen);
}
show(); // 必须调用show()使标志生效
}
相关函数
函数 | 作用 |
---|---|
setWindowFlags(Qt::WindowFlags flags) | 设置窗口标志 |
windowFlags() const | 获取当前窗口标志 |
setWindowModality(Qt::WindowModality modality) | 设置窗口模态性(阻塞其他窗口) |
isWindow() const | 判断是否为独立窗口 |
2. 获取UI对象
2.1 通过objectName获取控件
使用QObject::findChild()(推荐)
template <typename T>
T QObject::findChild(const QString &name = QString(),
Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
- 参数说明:
- name:控件的objectName(空字符串表示匹配所有名称)。
- options:查找选项(递归查找或仅直接子控件)。
#include <QPushButton>
#include <QDebug>
// 在QWidget或QMainWindow的子类中
void MyWidget::findButton() {
// 查找名称为"myButton"的QPushButton
QPushButton *button = findChild<QPushButton*>("myButton");
if (button) {
button->setText("Found!");
qDebug() << "找到按钮:" << button->objectName();
} else {
qDebug() << "未找到按钮";
}
}
使用QObject::findChildren()(批量查找)
template <typename T>
QList<T> QObject::findChildren(const QString &name = QString(),
Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
// 查找所有名称以"edit"开头的QLineEdit
QList<QLineEdit*> editList = findChildren<QLineEdit*>(QRegularExpression("^edit"));
foreach (QLineEdit *edit, editList) {
edit->setReadOnly(true);
}
全局查找(通过QApplication::allWidgets())
#include <QApplication>
// 查找整个应用程序中名称为"mainWindow"的主窗口
QMainWindow *mainWindow = nullptr;
foreach (QWidget *widget, qApp->allWidgets()) {
if (widget->objectName() == "mainWindow" && qobject_cast<QMainWindow*>(widget)) {
mainWindow = qobject_cast<QMainWindow*>(widget);
break;
}
}
使用
// 在UI文件中设置了objectName为"usernameEdit"的QLineEdit
QLineEdit *usernameEdit = findChild<QLineEdit*>("usernameEdit");
if (usernameEdit) {
usernameEdit->setPlaceholderText("请输入用户名");
}
// 查找所有QPushButton并设置样式
QList<QPushButton*> buttons = findChildren<QPushButton*>();
foreach (QPushButton *button, buttons) {
button->setStyleSheet("background-color: #4CAF50; color: white;");
}
- 若不需要直接访问控件对象,可通过信号与槽机制实现松耦合:
// 在UI设计时连接信号与槽,无需手动查找控件
connect(ui->myButton, &QPushButton::clicked, this, &MyWidget::onButtonClicked);