说明
如果ui设计中有提升过小部件,则无法直接使用QUiLoader 加载。完成加载需要重新实现UiLoader::createWidget()函数。
函数
- virtual QWidget * QUiLoader ::createWidget(const QString & className, QWidget * parent = Q_NULLPTR, const QString & name = QString())
释义
- 该函数完全由Qt系统自行调用,为非用户函数,但用户可以重新实现该函数。Qt在根据ui文件创建类对象时调用该函数。形参释义:className:Qt想要创建类对象的类的名称;parent:该对象必须设置的parent;name:该对象必须设置的对象名(需使用函数setObjectName()设置)。
示例
下面是类的实现,其中"MyTextEdit "作为自定义的提升小部件类
cpp
//自定义小部件
class MyTextEdit : public QTextEdit
{
Q_OBJECT
public:
MyTextEdit(QWidget * parent = nullptr) : MyTextEdit(parent){}
};
//自定义QUiLoader派生类
#include "QUiLoader"
class CustomClassUiLoader : public QUiLoader
{
Q_OBJECT
public:
CustomClassUiLoader(QObject * parent = Q_NULLPTR);
//重写createWidget()类
QWidget * createWidget(const QString & className, QWidget * parent = Q_NULLPTR,
const QString & name = QString())
{
if(className == "MyTextEdit"){
MyTextEdit* widget = new MyTextEdit(parent);
widget->setObjectName(name);
widget->setEdit(info.textEdit );
return widget;
}
return QUiLoader::createWidget(className, parent, name);
}
};
加载ui,
cpp
QUiLoader uiL;
QFile file("C:\\Users\\Administrator\\Desktop\\untitled2\\form.ui");
file.open(QFile::ReadOnly);
QWidget * widget = uiL.load(&file, ui->textEdit);
QVBoxLayout * layout = new QVBoxLayout;
layout->addWidget(widget);
layout->setContentsMargins(0, 0, 0, 0);
file.close();
ui->frame->setLayout(layout);