QUiLoader:使用自定义小部件加载 .ui 文件的要求
QUiLoader: requirements for loading .ui file with custom widgets?
我使用 Qt5-Designer 创建了一个 UI,我在运行时通过调用加载它
QUiLoader().load(qfile_object, this);
像魅力一样工作,但现在我已经将一些QLabel
元素提升为一个小部件类,MyQLabel
是从QLabel
派生的。
当我现在尝试加载 UI 时,我会收到每个提升的小部件的警告:
"QFormBuilder was unable to create a custom widget of the class 'MyQLabel'; defaulting to base class 'QLabel'."
该类如下所示:
class MyQLabel : public QLabel {
Q_OBJECT
public:
MyQLabel(QWidget *parent = nullptr) : QLabel(parent) {}
};
它已被自动moc
并链接到我的可执行文件。
有一种感觉,在尝试使用它之前,我必须以某种方式告诉QUiLoader
我的课程,但我不知道如何......
我必须为此创建一个插件吗?有没有办法复制,QUiLoader
怎么检查?
您需要
创建自己的派生版本的QUiLoader
,并提供可以创建小部件的工厂方法QUiLoader::createWidget
的实现。
您可以将此因素分解到由QUiLoader
加载的插件中。它必须实现一个QDesignerCustomWidgetInterface
实例。有关插件的完整示例,请参阅自定义控件插件示例。
// https://github.com/KubaO/stackoverflown/tree/master/questions/uiloader-custom-37775472
#include <QtUiTools>
#include <QtWidgets>
const char uiData[] =
"<ui version="4.0"><class>Widget</class><widget class="MyWidget" name="Widget">n"
"<property name="windowTitle" ><string>Widget</string></property>n"
"</widget><pixmapfunction></pixmapfunction><resources/><connections/>n"
"</ui>";
class MyWidget : public QLabel
{
Q_OBJECT
bool m_closed = false;
public:
MyWidget(QWidget* parent = 0) : QLabel("This is MyWidget", parent) {}
bool isClosed() const { return m_closed; }
void closeEvent(QCloseEvent *) Q_DECL_OVERRIDE { m_closed = true; }
};
class MyUiLoader : public QUiLoader {
public:
MyUiLoader(QObject * parent = 0) : QUiLoader(parent) {}
QWidget * createWidget(const QString & className, QWidget * parent = 0,
const QString & name = QString()) {
if (className == "MyWidget") {
MyWidget * w = new MyWidget(parent);
w->setObjectName(name);
return w;
}
return QUiLoader::createWidget(className, parent, name);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QBuffer buf;
buf.setData(uiData, sizeof(uiData));
MyUiLoader uiLoader;
auto uiMain = qobject_cast<MyWidget*>(uiLoader.load(&buf));
uiMain->show();
return app.exec();
}
#include "main.moc"
相关文章:
- 如何处理使用.ui文件生成的.h文件
- 可以在JSON文件的帮助下在Qt中创建UI表单
- 在 ui 文件中隐藏 QTabWidget 中的单个选项卡窗格?
- 由于多个 *.ui 文件而导致的多个Ui_Dialog定义?
- 如何将 .ui 完全转换为 C++ 头文件和源文件
- 从多个文件访问静态全局 WinForm UI 对象
- 如何在Qt Designer UI文件中清除QMainWindow的几何标记
- 将一个 UI 文件添加到另一个 UI 文件中
- 如何使用.UI文件在QT Creator中使用CMAKE制作GUI QT项目
- QT Creator不会更新.UI文件和设计器
- 为什么使用Qt Creator调整.ui文件会导致编译期间对.h文件进行更改
- 在流体中更改 .fl 文件在使用 Visual Studio 运行时不会更改 UI
- 连接QT中的多个.UI文件
- 将 .ui 文件导入 Qt5 C++时出错"was not declared in this scope"
- QT在UI文件中恢复了我的更改
- 是否可以在Qt设计器中使用依赖项注入(对于.ui文件)
- QML应用程序编译一个 *form.ui.qml文件,但忽略了关联的.qml文件
- QUiLoader:使用自定义小部件加载 .ui 文件的要求
- 无法从外部cpp文件访问Qt UI
- 在一个程序中处理多个QT Designer UI文件的最佳方法是什么?