重新创建Qt小部件

时间:2014-01-19 13:10:34

标签: qt widget qsplitter

我有一个WidgetA小部件,它是一个所有者绘制的小部件。它目前位于QMainWindow的{​​{1}}。点击按钮后,我想从此QVBoxLayout“分离”WidgetA,将QVBoxLayout插入此QSplitter并“读取”QVBoxLayout至此WidgetA。所有这些都没有破坏QSplitter,所以它将保留其绘图上下文等。

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

only one widget in a window

我想在WidgetAQSplitter之间添加WidgetA,并创建一个新的小部件QMainWindow,所以我最终得到:

two widgets, split by QSplitter

稍后我希望它进一步拆分,因此WidgetBWidgetA仍然允许自己分离并放置在新的WidgetB中,这样就有可能创造铁这个层次结构:

three widgets, split by two QSplitters

而且,要完成,还有一步:

four widgets, split by three QSplitters

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

2 个答案:

答案 0 :(得分:2)

请看,重见示例,可能对您有所帮助:

//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();
}

答案 1 :(得分:1)

当您使用作为布局一部分的小部件进行操作时,您需要使用QLayout(QVBoxLayout的父级)的适当方法从布局中分离项目:

QLayout :: removeWidget(如果它不是小部件,则为removeItem,但是间隔项或其他布局) QLayout :: addWidget(addItem - / - )

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