三大窗口基类
| 类 | 用途 | 特点 |
|---|
QWidget | 基础窗口 | 所有控件的基类 |
QMainWindow | 主窗口 | 自带菜单栏、工具栏、状态栏、Dock |
QDialog | 对话框 | 模态/非模态,exec()/open()/show() |
// 最小窗口
#include <QApplication>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget w;
w.resize(400, 300);
w.setWindowTitle("Hello Qt");
w.show();
return app.exec();
}
布局管理器
// 水平布局
auto *hLayout = new QHBoxLayout;
hLayout->addWidget(new QPushButton("Left"));
hLayout->addWidget(new QPushButton("Right"));
// 垂直布局
auto *vLayout = new QVBoxLayout;
vLayout->addWidget(new QLabel("Top"));
vLayout->addLayout(hLayout); // 嵌套布局
vLayout->addWidget(new QLabel("Bottom"));
// 网格布局
auto *grid = new QGridLayout;
grid->addWidget(new QLabel("Name:"), 0, 0);
grid->addWidget(new QLineEdit, 0, 1);
grid->addWidget(new QPushButton("OK"), 1, 0, 1, 2); // 跨 2 列
// 表单布局(两列标签-值)
auto *form = new QFormLayout;
form->addRow("Name:", new QLineEdit);
form->addRow("Email:", new QLineEdit);
// 设置到窗口
setLayout(vLayout);
常用属性
layout->setSpacing(10); // 控件间距
layout->setContentsMargins(10,5,10,5); // 上下左右边距
widget->setSizePolicy(QSizePolicy::Expanding, // 水平:尽量占满
QSizePolicy::Fixed); // 垂直:固定
常用控件
// 按钮
auto *btn = new QPushButton("Click me");
connect(btn, &QPushButton::clicked, []() { qDebug() << "clicked"; });
// 标签
auto *label = new QLabel("Hello");
label->setAlignment(Qt::AlignCenter);
label->setPixmap(QPixmap(":/icon.png"));
// 输入框
auto *edit = new QLineEdit;
edit->setPlaceholderText("请输入...");
connect(edit, &QLineEdit::returnPressed, []() { /* 回车 */ });
// 文本框
auto *text = new QTextEdit;
text->setPlainText("多行文本");
// 复选框 / 单选框
auto *cb = new QCheckBox("Enable feature");
auto *rb1 = new QRadioButton("Option A");
// 下拉框
auto *combo = new QComboBox;
combo->addItems({"Item 1", "Item 2", "Item 3"});
connect(combo, QOverload<int>::of(&QComboBox::currentIndexChanged),
[](int i) { qDebug() << i; });
// 列表
auto *list = new QListWidget;
list->addItem("Item A");
信号槽在 UI 中的组合模式
// 模式 1:按钮点击 → 读取输入 → 更新标签
connect(btn, &QPushButton::clicked, [=]() {
QString name = edit->text();
label->setText("Hello, " + name);
});
// 模式 2:输入框变化 → 实时更新
connect(edit, &QLineEdit::textChanged, label, &QLabel::setText);
// 模式 3:复选框 → 控制控件启用
connect(cb, &QCheckBox::toggled, edit, &QLineEdit::setEnabled);
布局黄金法则
- 永远用布局,不要手动 setGeometry — 布局自动处理 DPI、窗口缩放
- 嵌套布局实现复杂界面 — VBox 套 HBox 套 Form
- 用 QSpacerItem 撑开空间 —
layout->addStretch() 推到一边
- 最小尺寸由内容决定 — 不需要手动设
setMinimumSize