Qt 动态加载界面

基本概念

  • 使用 uic 可以将基于 XML 的 ui 文件转换成 C++ 文件
  • 使用 QUiLoader 可以实现动态加载 ui

动态加载 UI

  1. 在 CMakeList.txt 文件中添加依赖项
  2. 载入 ui 文件
  3. 通过 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()));
}