QUiLoader小部件不显示如果加载在派生的QWidget [英] QUiLoader widget not showing if loaded in derived QWidget

查看:411
本文介绍了QUiLoader小部件不显示如果加载在派生的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 code>然后它不再显示有了。

  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
#includemywidget.h
#include< QDebug>

MyWidget :: MyWidget(QWidget * parent):QWidget(parent){
qDebug()< 在这里做点什么问题1:为什么窗口小部件(组框)没有显示在那里?问题1:为什么窗口小部件(组框)没有显示在那里?如何使它出现?



好的,问题1完成感谢@KubaOber。现在我想访问 untitled.ui 里面的小部件,我试过:

  MyWidget :: MyWidget(QWidget * parent):QWidget(parent){
foreach(QLabel * label,parent-> findChildren< QLabel *>())
if(label-> ; objectName()。contains(Value))
qDebug()< label<<标签;

}

但不返回任何内容。相反,在 loader.load(& file,vLayoutWidget)中传递父级会使 untitled.ui 而且还会删除 vLayoutWidget 的内容。我想问题是什么应该作为父项在 loader.load())

解决方案

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

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

你正在做的是初始化一个 MyWidget 已加载为父,然后您立即将 w 添加到布局中,有效地舍弃加载器加载的任何内容。 / p>

你需要告诉加载器父类添加它加载到的窗口小部件,当然注意 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 {这个};
MyWidget * m_myWidget;
public:
explicit Widget(QWidget * loaded,QWidget * parent = nullptr):
QWidget {parent},
m_myWidget {qobject_cast< MyWidget *> b $ b {
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);
}

The code above produces the image above. But I would like to do something with the widget just loaded, that's why I derived MyWidget from QWidget. And there seems to be the problem.

If I replace QWidget by MyWidget then it doesn't show there anymore. The code below produces the image below.

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

Where 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";
}

Question 1: Why the widget (group box) isn't showing there? How to make it appear?

Ok, question 1 completed thanks to @KubaOber. Now I would like to access the widgets inside untitled.ui, I tried:

MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
    foreach (QLabel *label, parent->findChildren<QLabel*>())
        if(label->objectName().contains("Value"))
            qDebug() << "label" << label;

}

But it returns nothing. Instead, passing a parent in loader.load(&file, vLayoutWidget)) makes the untitled.ui widgets available but also craps the contents of vLayoutWidget. I guess the question is what should be passed in as parent in the loader.load())?

解决方案

The way you use the loader doesn't mean "load a MyWidget using QUiLoader:

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

What you're doing above is initializing a MyWidget that has whatever the loader has loaded as a parent. And then you're promptly reparenting w by adding it to a layout, effectively discarding whatever the loader has loaded.

You need to tell the loader what parent to add the widgets it has loaded to, of course noting that MyWidget doesn't need to be dynamically allocated:

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

Here's how it might look when put together:

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

If your ui file's top-level widget is a MyWidget, then you'll need to let the loader know how to instantiate it - see this answer for details. And then you would write it as follows:

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

这篇关于QUiLoader小部件不显示如果加载在派生的QWidget的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆