gpt4 book ai didi

c++ - 如果在派生的 QWidget 中加载,QUiLoader 小部件不显示

转载 作者:行者123 更新时间:2023-11-28 02:04:32 25 4
gpt4 key购买 nike

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);
}

enter image description here

上面的代码生成上面的图像。但我想对刚刚加载的小部件做一些事情,这就是为什么我从 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);
}

enter image description here

哪里 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;

}

但它什么也没有返回。相反,在 loader.load(&file, vLayoutWidget)) 中传递一个父级使得 untitled.ui 小部件可用,但也会破坏 vLayoutWidget 的内容.我想问题是应该在 loader.load()) 中作为父级传递什么?

最佳答案

您使用加载器的方式并不意味着“使用QUiLoader加载MyWidget:

MyWidget *w = new MyWidget(loader.load(&file));

您在上面所做的是初始化一个 MyWidget,它将加载器加载的所有内容作为 父级。然后,您通过将 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,那么您需要让加载器知道如何实例化它 - 参见 this answer了解详情。然后你会这样写:

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};
...

关于c++ - 如果在派生的 QWidget 中加载,QUiLoader 小部件不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com