输入关键词开始搜索

Qt 窗口与布局

三大窗口基类

用途特点
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);

布局黄金法则

  1. 永远用布局,不要手动 setGeometry — 布局自动处理 DPI、窗口缩放
  2. 嵌套布局实现复杂界面 — VBox 套 HBox 套 Form
  3. 用 QSpacerItem 撑开空间layout->addStretch() 推到一边
  4. 最小尺寸由内容决定 — 不需要手动设 setMinimumSize