我有自定义QHBoxLayout
。我将此布局添加到QVBoxLayout
的{{1}}。因为QFrame
已经有了布局,所以我无法调用自定义QFrame
的基类构造函数,并将QHBoxLaout
作为父级。所以我对QFrame
做了一个addItem。这工作正常,但当我尝试绘制我的cutom布局作为孩子我得到QVBoxLayout
。如果已经使用NULL
和ItemAt()
将返回的ptr抓到我的自定义布局,但这对我来说非常难看。我怎么做对的?
MyLayoutClass.h
dynamic_cast
MainWindow.h:
class MyLayoutClass : public QHBoxLayout{
Q_OBJECT
public:
explicit MyLayoutClass(const QString& rb_name, const QString& label_name, QWidget * parent = 0);
QRadioButton * rb;
QLabel * label;
};
MainWindow构造函数:
class MainWindow : public QMainWindow{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private:
Ui::MainWindow *ui;
QFrame * MyFrame;
}
MyLayoutClass构造函数:
MyLayoutClass::MyLayoutClass(const QString &rb_name, const QString &label_name, QWidget *parent) : QHBoxLayout(), rb(nullptr), label(nullptr) { rb = new QRadioButton(rb_name,parent); label = new QLabel(label_name,parent);MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),MyFrame(nullptr), ui(new Ui::MainWindow) { ui->setupUi(this); for(int i = 0; i <4; i++) { MyLayoutClass * addLayout = new MyLayoutClass("Hallo","Welt",this->ui->MyFrame); this->ui->MyFrame->layout()->addItem(addLayout); } MyLayoutClass* child = this->ui->MyFrame->findChild<MyLayoutClass*>(); if(child==NULL) qDebug()<<"Not a single Child of the Frame"; child = this->ui->MyFrame->layout()->findChild<MyLayoutClass*>(); if(child== NULL) qDebug()<<"Not a single Child of Frame Layout"; MyLayoutClass * first = dynamic_cast<MyLayoutClass*>(ui->MyFrame->layout()->itemAt(0)); qDebug()<< first->rb->text(); }
输出: &#34;框架中没有一个孩子&#34; &#34;不是一个框架布局的孩子&#34; &#34;喂&#34;
答案 0 :(得分:0)
对不起,伙计们,我已经尝试了一些,答案非常简单。与只接受QHBoxLayout
为父级的QWidget
的构造函数相对应,成员函数setParent(Q_Object*)
接受布局为父级。
所以MyLayoutClass
构造函数中的这一行解决了我的问题
this->setParent(parent->layout());
之后输出只是“你好”。所以我的自定义布局现在是Frame和他的垂直布局的子代。之前这是不可能的,因为框架已经有了布局。看起来我还没有理解它。