设置自定义布局的右侧父级

时间:2017-05-06 12:53:19

标签: c++ qt c++11

我有自定义QHBoxLayout。我将此布局添加到QVBoxLayout的{​​{1}}。因为QFrame已经有了布局,所以我无法调用自定义QFrame的基类构造函数,并将QHBoxLaout作为父级。所以我对QFrame做了一个addItem。这工作正常,但当我尝试绘制我的cutom布局作为孩子我得到QVBoxLayout。如果已经使用NULLItemAt()将返回的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;

1 个答案:

答案 0 :(得分:0)

对不起,伙计们,我已经尝试了一些,答案非常简单。与只接受QHBoxLayout为父级的QWidget的构造函数相对应,成员函数setParent(Q_Object*)接受布局为父级。 所以MyLayoutClass构造函数中的这一行解决了我的问题

this->setParent(parent->layout());

之后输出只是“你好”。所以我的自定义布局现在是Frame和他的垂直布局的子代。之前这是不可能的,因为框架已经有了布局。看起来我还没有理解它。