基本概念
- 使用 uic 可以将基于 XML 的 ui 文件转换成 C++ 文件
- 使用 QUiLoader 可以实现动态加载 ui
动态加载 UI
- 在 CMakeList.txt 文件中添加依赖项
- 载入 ui 文件
- 通过
findChild<T>("name")
查找和使用子控件
案例
头文件
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUiLoader> #include <QFile> #include <QSpinBox> #include <QLineEdit> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: QSpinBox *firstInput; QSpinBox *secondInput; QLineEdit *output; private slots: void on_firstInput_valueChanged(int value); void on_secondInput_valueChanged(int value); }; #endif // WIDGET_H
实现文件
#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { QUiLoader loader; QFile file(":/form.ui"); file.open(QIODevice::ReadOnly); QWidget *widget = loader.load(&file, this); file.close(); firstInput = findChild<QSpinBox*>("firstSpinBox"); secondInput = findChild<QSpinBox*>("secondSpinBox"); output = findChild<QLineEdit*>("resultLineEdit"); qDebug() << firstInput; qDebug() << secondInput; qDebug() << output; connect(firstInput, &QSpinBox::valueChanged, this, &Widget::on_firstInput_valueChanged); connect(secondInput, &QSpinBox::valueChanged, this, &Widget::on_secondInput_valueChanged); } Widget::~Widget() { } void Widget::on_firstInput_valueChanged(int value) { output->setText(QString::number(firstInput->value() + secondInput->value())); } void Widget::on_secondInput_valueChanged(int value) { output->setText(QString::number(firstInput->value() + secondInput->value())); }