2

我有一个WidgetA小部件,它是一个所有者绘制的小部件。它当前放置在QMainWindow'sQVBoxLayout中。单击按钮后,我想WidgetA从 this中“分离” QVBoxLayout,插入QSplitterthisQVBoxLayout并“读取”WidgetA到 this QSplitter。所有这一切都没有破坏WidgetA,因此它将保留其绘图上下文等。

所以,目前我有这个(窗口中只有一个小部件):

一个窗口中只有一个小部件

我想在andQSplitter之间放置一个,并创建一个新的小部件,所以我最终得到:WidgetAQMainWindowWidgetB

两个小部件,由 QSplitter 拆分

后来我希望它进一步分裂,所以两者WidgetAWidgetB仍然允许自己被分离并放置在一个 newQSplitter中,因此可以创建这个层次结构:

三个小部件,由两个 QSplitter 分割

并且,为了完成,还有一步:

四个小部件,由三个 QSplitter 分割

我在 Qt 方面不是很有经验,所以我想做的事情可能看起来很明显,但我找不到如何“重新定义”小部件。这在Qt中可能吗?

4

2 回答 2

2

请参阅reparent example,可能对您有帮助:

//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(如果不是widget,则removeItem,而是spacer item或其他布局) QLayout::addWidget (addItem --/--)

顺便说一句:即使小部件在布局之间移动,它的父级甚至可能保持不变。我猜你不需要调用 QWidget::setParent() 因为 addWidget/removeWidget 的调用将为你完成所有工作。

于 2014-01-19T13:47:28.867 回答