1

プッシュ ボタンをクリックして、ウィジェットのレイアウトをQStackedLayout動的に変更したいと考えています。からへ、またはその逆に切り替えることはできますが、私のアプローチは では機能しません。考えられるすべてのオプションを使い果たしました。サンプルコードを添付します。どうすれば目的を達成できるか知っている人はいますか?QHBoxLayoutQVBoxLayoutQVBoxLayoutQHBoxLayoutQStackedLayout

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QStackedLayout>
#include <QGridLayout>
#include <QLabel>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    QPushButton *button1_;
    QPushButton *button2_;
    QPushButton *button3_;

    QHBoxLayout *hLayout_;
    QVBoxLayout *vLayout_;
    QStackedLayout *sLayout_;
    QVBoxLayout *gLayout_;

public slots:
    void layoutHorizontal();
    void layoutVertical();
    void layoutStacked();

private:
    bool isStackedLayout_;
    QLabel *bar_;
};

#endif // WIDGET_H


#include "widget.h"
#include <QtAlgorithms>
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent){

    bar_ = new QLabel(tr("TEST!"));

    button1_ = new QPushButton(tr("to Horizontal Layout"),(bar_));
    button2_ = new QPushButton(tr("to Vertical Layout"),(bar_));
    button3_ = new QPushButton(tr("to Stacked Layout"),(bar_));

    button1_->setStyleSheet("background: rgba(255,255,0,255);");
    button2_->setStyleSheet("background: rgba(255,0,255,255);");
    button3_->setStyleSheet("background: rgba(0,255,255,255);");

    connect(button1_,SIGNAL(clicked()),this,SLOT(layoutHorizontal()));
    connect(button2_,SIGNAL(clicked()),this,SLOT(layoutVertical()));
    connect(button3_,SIGNAL(clicked()),this,SLOT(layoutStacked()));


    gLayout_ = new QVBoxLayout;
    setLayout(gLayout_);

    hLayout_ = new QHBoxLayout(bar_);
    hLayout_->setObjectName(tr("currentLayout"));
    gLayout_->addWidget(bar_);

    hLayout_->addWidget(button1_);
    hLayout_->addWidget(button2_);
    hLayout_->addWidget(button3_);

    isStackedLayout_ = false;

    resize(480,200);

}

Widget::~Widget() { }

void Widget::layoutHorizontal(){
    QLayout *layout = bar_->findChild<QLayout *>(tr("currentLayout"));
    layout->removeWidget(button1_);
    layout->removeWidget(button2_);
    layout->removeWidget(button3_);

    delete layout;

    QHBoxLayout *hLayout_ = new QHBoxLayout(bar_);
    hLayout_->setObjectName(tr("currentLayout"));
    hLayout_->addWidget(button1_);
    hLayout_->addWidget(button2_);
    hLayout_->addWidget(button3_);

    isStackedLayout_ = false;

}

void Widget::layoutVertical(){
    QLayout *layout = bar_->findChild<QLayout *>(tr("currentLayout"));
    layout->removeWidget(button1_);
    layout->removeWidget(button2_);
    layout->removeWidget(button3_);
    delete layout;

    QVBoxLayout *vLayout_ = new QVBoxLayout(bar_);
    vLayout_->setObjectName(tr("currentLayout"));

    vLayout_->addWidget(button1_);
    vLayout_->addWidget(button2_);
    vLayout_->addWidget(button3_);

    isStackedLayout_ = false;
}

void Widget::layoutStacked(){
    QLayout *layout = bar_->findChild<QLayout *>(tr("currentLayout"));
    layout->removeWidget(button1_);
    layout->removeWidget(button2_);
    layout->removeWidget(button3_);
    delete layout;

    QStackedLayout *sLayout_ = new QStackedLayout(bar_);
    sLayout_->setObjectName(tr("currentLayout"));

    sLayout_->addWidget(button1_);
    sLayout_->addWidget(button2_);
    sLayout_->addWidget(button3_);

    isStackedLayout_ = true;
}
4

2 に答える 2

0

ボタンの可視性プロパティは、ウィジェットを から引き出した後、「非表示」に設定されます(スタッキングをエミュレートするために がこのプロパティに依存しているQStackedLayout可能性があります)。QStackedLayoutそのため、次を追加することでコードを機能させることができました。

void Widget::layoutHorizontal() {

   ...

   button1_->setVisible(true);
   button2_->setVisible(true);
   button3_->setVisible(true);

   isStackedLayout_ = false;
}

また、ウィジェットを削除する前に、レイアウトからウィジェットを削除する必要がないことにも注意してください。レイアウトは、その中のウィジェットの所有権を取得しません。そのため、次のものを削除できます。

layout->removeWidget(button1_);
layout->removeWidget(button2_);
layout->removeWidget(button3_);
于 2013-08-02T00:49:50.553 に答える