如果在派生的 QWidget 中加载,QUiLoader 小部件不显示
QUiLoader widget not showing if loaded in derived QWidget
Widget::Widget(QWidget *parent) : QWidget(parent) {
file.open(QFile::ReadOnly);
QWidget *w = loader.load(&file);
// MyWidget *w = new MyWidget(loader.load(&file));
vLayout.addWidget(w);
file.close();
vLayout.addWidget(&bt);
}
上面的代码生成上面的图像。但是我想对刚刚加载的小部件做一些事情,这就是为什么我从 QWidget
派生 MyWidget
。而且好像有问题。
如果我用 MyWidget
替换 QWidget
那么它就不会再显示了。下面的代码生成下面的图像。
Widget::Widget(QWidget *parent) : QWidget(parent) {
file.open(QFile::ReadOnly);
// QWidget *w = loader.load(&file);
MyWidget *w = new MyWidget(loader.load(&file));
vLayout.addWidget(w);
file.close();
vLayout.addWidget(&bt);
}
其中 MyWidget
:
// mywidget.h
#include <QWidget>
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
};
// mywidget.cpp
#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
qDebug() << "do something here";
}
问题 1:为什么小部件(组框)没有显示在那里?如何让它出现?
好的,感谢@KubaOber,问题 1 已完成。现在我想访问 untitled.ui
里面的小部件,我试过:
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
foreach (QLabel *label, parent->findChildren<QLabel*>())
if(label->objectName().contains("Value"))
qDebug() << "label" << label;
}
但它returns没什么。相反,在 loader.load(&file, vLayoutWidget))
中传递一个父项可以使 untitled.ui
小部件可用,但也会破坏 vLayoutWidget
的内容。我想问题是应该在 loader.load())
?
中作为父级传递什么
您使用加载程序的方式并不意味着“使用 QUiLoader
:
加载 MyWidget
MyWidget *w = new MyWidget(loader.load(&file));
您在上面所做的是初始化一个 MyWidget
,它具有加载程序作为 parent 加载的任何内容。然后您通过将其添加到布局中来迅速重新设置 w
父级,从而有效地丢弃加载程序已加载的任何内容。
你需要告诉加载器将它加载的小部件添加到哪个父级,当然要注意 MyWidget
不需要动态分配:
auto w = new MyWidget;
loader.load(&file, w);
下面是它放在一起时的样子:
class Widget : public QWidget {
Q_OBJECT
QVBoxLayout m_layout{this};
MyWidget m_myWidget;
QVBoxLayout m_myLayout{&m_myWidget};
public:
explicit Widget(QIODevice * source, QWidget * parent = nullptr) :
QWidget{parent}
{
auto loaded = QUiLoader{}.load(source, &m_myWidget);
m_layout.addWidget(&m_myWidget);
m_myLayout.addWidget(loaded);
}
};
如果您的 ui 文件的顶级小部件是 MyWidget
,那么您将需要让加载器知道如何实例化它 - 请参阅 了解详细信息。然后你会这样写:
class Widget : public QWidget {
Q_OBJECT
QVBoxLayout m_layout{this};
MyWidget * m_myWidget;
public:
explicit Widget(QWidget * loaded, QWidget * parent = nullptr) :
QWidget{parent},
m_myWidget{qobject_cast<MyWidget*>(loaded)}
{
m_layout.addWidget(m_myWidget);
}
};
...
MyUiLoader loader{}
auto loaded = loader.load(...);
Widget widget{loaded};
...
Widget::Widget(QWidget *parent) : QWidget(parent) {
file.open(QFile::ReadOnly);
QWidget *w = loader.load(&file);
// MyWidget *w = new MyWidget(loader.load(&file));
vLayout.addWidget(w);
file.close();
vLayout.addWidget(&bt);
}
上面的代码生成上面的图像。但是我想对刚刚加载的小部件做一些事情,这就是为什么我从 QWidget
派生 MyWidget
。而且好像有问题。
如果我用 MyWidget
替换 QWidget
那么它就不会再显示了。下面的代码生成下面的图像。
Widget::Widget(QWidget *parent) : QWidget(parent) {
file.open(QFile::ReadOnly);
// QWidget *w = loader.load(&file);
MyWidget *w = new MyWidget(loader.load(&file));
vLayout.addWidget(w);
file.close();
vLayout.addWidget(&bt);
}
其中 MyWidget
:
// mywidget.h
#include <QWidget>
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
};
// mywidget.cpp
#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
qDebug() << "do something here";
}
问题 1:为什么小部件(组框)没有显示在那里?如何让它出现?
好的,感谢@KubaOber,问题 1 已完成。现在我想访问 untitled.ui
里面的小部件,我试过:
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
foreach (QLabel *label, parent->findChildren<QLabel*>())
if(label->objectName().contains("Value"))
qDebug() << "label" << label;
}
但它returns没什么。相反,在 loader.load(&file, vLayoutWidget))
中传递一个父项可以使 untitled.ui
小部件可用,但也会破坏 vLayoutWidget
的内容。我想问题是应该在 loader.load())
?
您使用加载程序的方式并不意味着“使用 QUiLoader
:
MyWidget
MyWidget *w = new MyWidget(loader.load(&file));
您在上面所做的是初始化一个 MyWidget
,它具有加载程序作为 parent 加载的任何内容。然后您通过将其添加到布局中来迅速重新设置 w
父级,从而有效地丢弃加载程序已加载的任何内容。
你需要告诉加载器将它加载的小部件添加到哪个父级,当然要注意 MyWidget
不需要动态分配:
auto w = new MyWidget;
loader.load(&file, w);
下面是它放在一起时的样子:
class Widget : public QWidget {
Q_OBJECT
QVBoxLayout m_layout{this};
MyWidget m_myWidget;
QVBoxLayout m_myLayout{&m_myWidget};
public:
explicit Widget(QIODevice * source, QWidget * parent = nullptr) :
QWidget{parent}
{
auto loaded = QUiLoader{}.load(source, &m_myWidget);
m_layout.addWidget(&m_myWidget);
m_myLayout.addWidget(loaded);
}
};
如果您的 ui 文件的顶级小部件是 MyWidget
,那么您将需要让加载器知道如何实例化它 - 请参阅
class Widget : public QWidget {
Q_OBJECT
QVBoxLayout m_layout{this};
MyWidget * m_myWidget;
public:
explicit Widget(QWidget * loaded, QWidget * parent = nullptr) :
QWidget{parent},
m_myWidget{qobject_cast<MyWidget*>(loaded)}
{
m_layout.addWidget(m_myWidget);
}
};
...
MyUiLoader loader{}
auto loaded = loader.load(...);
Widget widget{loaded};
...