Qt Designer 是 Qt 框架提供的一款强大的可视化界面设计工具,允许开发者通过拖放方式创建和设计 GUI 界面,而无需编写大量的布局代码。设计完成的界面可以轻松集成到 Qt 应用程序中,显著提高开发效率。
复杂界面通常需要嵌套多种布局以实现灵活的排列:
示例:登录表单嵌套布局
QVBoxLayout (主布局)
├── QLabel (标题)
├── QHBoxLayout (用户名行)
│ ├── QLabel (用户名标签)
│ └── QLineEdit (用户名输入框)
├── QHBoxLayout (密码行)
│ ├── QLabel (密码标签)
│ └── QLineEdit (密码输入框)
└── QHBoxLayout (按钮行)
├── QPushButton (登录按钮)
└── QPushButton (取消按钮)
拉伸因子:控制布局中控件的相对大小
stretch
值大小策略:控制控件在布局中的行为
在 Qt Designer 中直接连接信号和槽:
在 Qt Designer 中添加自定义信号槽:
在运行时动态连接信号槽:
// 在代码中连接信号槽
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onCustomButtonClicked);
// 自定义槽函数实现
void MainWindow::onCustomButtonClicked()
{
// 处理按钮点击事件
}
将标准控件提升为自定义控件:
开发自定义控件并集成到 Qt Designer 中:
示例:自定义 LED 指示器插件
// ledindicator.h
class LedIndicator : public QWidget
{
Q_OBJECT
Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
explicit LedIndicator(QWidget *parent = nullptr);
bool isActive() const;
QColor color() const;
public slots:
void setActive(bool active);
void setColor(const QColor &color);
signals:
void activeChanged(bool active);
protected:
void paintEvent(QPaintEvent *event) override;
private:
bool m_active;
QColor m_color;
};
在 Qt Designer 中设置应用全局样式表:
为特定控件设置样式表:
/* 自定义按钮样式 */
QPushButton {
background-color: #4CAF50;
border: none;
color: white;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
QPushButton:hover {
background-color: #45a049;
}
QPushButton:pressed {
background-color: #3d8b40;
}
/* 自定义文本框样式 */
QLineEdit {
border: 1px solid #ccc;
border-radius: 4px;
padding: 6px;
font-size: 14px;
}
QLineEdit:focus {
border: 1px solid #5B9DD9;
box-shadow: 0 0 5px rgba(91, 157, 217, 0.5);
}
lupdate your_project.pro -ts translations/en.ts translations/fr.ts
// 在应用程序中加载翻译文件
QTranslator translator;
translator.load(":/translations/en.qm");
qApp->installTranslator(&translator);
在 Qt Designer 设计的界面中安装事件过滤器:
// 在MainWindow构造函数中安装事件过滤器
ui->myButton->installEventFilter(this);
// 实现事件过滤函数
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->myButton && event->type() == QEvent::HoverEnter) {
// 处理按钮悬停事件
return true;
}
return QObject::eventFilter(obj, event);
}
在运行时动态修改 Qt Designer 设计的 UI:
// 动态添加控件
QPushButton *newButton = new QPushButton("New Button", this);
ui->verticalLayout->addWidget(newButton);
// 动态修改控件属性
ui->label->setText("New Text");
ui->label->setStyleSheet("color: red;");
编写测试用例验证 UI 功能:
#include
#include "mainwindow.h"
class TestMainWindow : public QObject
{
Q_OBJECT
private slots:
void testButtonClick() {
MainWindow window;
window.show();
// 模拟按钮点击
QTest::mouseClick(window.ui->pushButton, Qt::LeftButton);
// 验证结果
QCOMPARE(window.ui->label->text(), QString("Button Clicked"));
}
};
QTEST_MAIN(TestMainWindow)
#include "testmainwindow.moc"
设计一个包含多个图表和数据表格的监控界面,具有以下功能:
// 在MainWindow构造函数中初始化UI
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化图表
initCharts();
// 连接信号槽
connect(ui->treeWidget, &QTreeWidget::itemClicked, this, &MainWindow::onTreeItemClicked);
connect(ui->filterButton, &QPushButton::clicked, this, &MainWindow::onFilterButtonClicked);
connect(ui->languageComboBox, &QComboBox::currentTextChanged, this, &MainWindow::onLanguageChanged);
}
// 初始化图表
void MainWindow::initCharts()
{
// 创建图表
QChart *chart = new QChart();
chart->setTitle("Sensor Data");
// 创建系列
QLineSeries *series = new QLineSeries();
*series << QPointF(0, 6) << QPointF(9, 4) << QPointF(15, 20) << QPointF(25, 12) << QPointF(29, 26);
// 添加系列到图表
chart->addSeries(series);
// 创建坐标轴
QValueAxis *axisX = new QValueAxis();
axisX->setTitleText("Time");
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);
QValueAxis *axisY = new QValueAxis();
axisY->setTitleText("Value");
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);
// 设置图表视图
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 将图表视图添加到布局
ui->chartLayout->addWidget(chartView);
}
通过掌握 Qt Designer 的高级应用技巧,可以高效地设计出复杂、美观且功能强大的用户界面,同时保持代码的可维护性和可扩展性。