2

所有者が描いたWidgetAウィジェットであるウィジェットがあります。現在、 の に配置されていQMainWindowますQVBoxLayoutWidgetAボタンをクリックした後、 this から「切り離し」 、 thisQVBoxLayoutに挿入QSplitterし、 thisQVBoxLayoutに「readd」WidgetAしたいと思いますQSplitter。これらすべてを破棄することなくWidgetA、描画コンテキストなどを保持します。

だから、現在私はこれを持っています(ウィンドウ内のウィジェットは1つだけです):

ウィンドウ内のウィジェットは 1 つだけ

QSplitterと の間WidgetAにを置き、QMainWindow新しいウィジェット を作成しWidgetBたいので、最終的には次のようになります。

QSplitter で分割された 2 つのウィジェット

後でさらに分割したいので、WidgetAとの両方をWidgetB切り離して新しいQSplitterに配置できるため、この階層を作成することができます。

2 つの QSplitter で分割された 3 つのウィジェット

最後に、もう 1 つの手順を実行します。

3 つの QSplitter で分割された 4 つのウィジェット

私は Qt の経験があまりないので、やろうとしていることはかなり明白に思えるかもしれませんが、ウィジェットを「再親化」する方法が見つかりませんでした。これはQtで可能ですか?

4

2 に答える 2

2

reparent の例を参照してください。役立つ場合があります。

//MyMainWindow.h
#include <QWidget>
#include <QPainter>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QSplitter>

class MyWidget: public QWidget
{
public:
  MyWidget(QWidget* parent, int number)
    : QWidget(parent),
      m_number(number)
  {

  }

private:
  virtual void paintEvent(QPaintEvent* e)
  {
    QWidget::paintEvent(e);

    QPainter p(this);
    p.fillRect( rect(), Qt::red);
    p.drawText( rect(), Qt::AlignCenter, QString::number(m_number) );
  }

private:
  int m_number;
};

class MyMainWindow: public QWidget
{
  Q_OBJECT

public:
  MyMainWindow()
  {
    setFixedSize(300, 200);

    m_mainLayout = new QVBoxLayout(this);
    QHBoxLayout* buttonLayout = new QHBoxLayout;
    m_mainLayout->addLayout(buttonLayout);

    m_button = new QPushButton("Button", this);
    buttonLayout->addWidget(m_button);

    connect(m_button, SIGNAL(clicked()), this, SLOT(onButtonClickedOnce()));

    m_initWidget = new MyWidget(this, 1);
    m_mainLayout->addWidget(m_initWidget);
  }

private slots:
  void onButtonClickedOnce()
  {
    m_button->disconnect(this);

    m_mainLayout->removeWidget(m_initWidget);
    QSplitter* splitter = new QSplitter(Qt::Horizontal, this);
    m_mainLayout->addWidget(splitter);

    splitter->addWidget(m_initWidget);
    MyWidget* newWidget = new MyWidget(splitter, 2);
    splitter->addWidget(newWidget);
  }

private:
  QVBoxLayout* m_mainLayout;
  QWidget* m_initWidget;
  QPushButton* m_button;
};

//main.cpp

#include <QtWidgets/QApplication>
#include "MyMainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyMainWindow mainWindow;
    mainWindow.show();

    return a.exec();
}
于 2014-01-19T14:18:52.547 に答える
1

レイアウトの一部であるウィジェットを操作する場合、QLayout (QVBoxLayout の親) の適切なメソッドを使用して、アイテムをレイアウトから切り離す必要があります。

QLayout::removeWidget (ウィジェットではなく、スペーサー アイテムまたは別のレイアウトの場合は removeItem) QLayout::addWidget (addItem --/--)

ところで:ウィジェットがレイアウト間を移動しても、その親は同じままです。QWidget::setParent() を呼び出す必要はないと思います。addWidget/removeWidget の呼び出しですべての作業が行われるからです。

于 2014-01-19T13:47:28.867 に答える