具有布局、QPushButton 和 QGraphicsItem 的 Qt 应用程序

Qt Application with layout's, QPushButton and QGraphicsItem

我正在尝试绘制各种形状,如矩形、椭圆、文本等 uisng QGraphicsView 和 QGraphicsScene。为此,我正在尝试创建一个界面,其中将有一个垂直布局,除此之外几乎没有按钮。单击这些按钮,我可以在屏幕上显示各种 QGraphicsItem。我想以编程方式创建此界面但不使用 ui.
我试过了,结果是这样的。

我想要右侧的按钮和左侧的垂直布局,两者都应该填满整个屏幕。
这是我当前的实现:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QGraphicsScene* scene = new QGraphicsScene(this);

    QGraphicsView* view = new QGraphicsView(this);
    view->setScene(scene);

    QWidget* mainWidget = new QWidget(this);
    QHBoxLayout *mainLayout = new QHBoxLayout();

    QVBoxLayout *buttonLayout = new QVBoxLayout();
    QVBoxLayout *vlayout2 = new QVBoxLayout();

    vlayout2->addWidget(view);

    QPushButton *btn1 = new QPushButton("Rectangle");
    btn1->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
    
    QPushButton *btn2 = new QPushButton("Ellipse");
    btn2->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
    
    QPushButton *btn3 = new QPushButton("Text");
    btn3->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );

    buttonLayout->addWidget(btn1);
    buttonLayout->addWidget(btn2);
    buttonLayout->addWidget(btn3);
    buttonLayout->addStretch();

    mainLayout->addLayout(buttonLayout);
    mainLayout->addLayout(vlayout2);

    mainWidget->setLayout(mainLayout);
}    

有谁可以guide我吗?

实际上,它应该与我评论中给出的提示一起工作。

我做了一个MCVE来说服自己:

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qMain;
  qMain.setWindowTitle("Test Box Layout");
  qMain.resize(640, 320);
  QHBoxLayout qHBox;
  QVBoxLayout qVBoxBtns;
  QPushButton qBtnRect("Rectangle");
  qVBoxBtns.addWidget(&qBtnRect);
  QPushButton qBtnCirc("Circle");
  qVBoxBtns.addWidget(&qBtnCirc);
  QPushButton qBtnText("Text");
  qVBoxBtns.addWidget(&qBtnText);
  qVBoxBtns.addStretch();
  qHBox.addLayout(&qVBoxBtns);
  QVBoxLayout qVBoxView;
  QGraphicsView qView;
  qVBoxView.addWidget(&qView, 1);
  qHBox.addLayout(&qVBoxView, 1);
  qMain.setLayout(&qHBox);
  qMain.show();
  // runtime loop
  return app.exec();
}

输出:

因此,OP 的代码中一定有其他内容……

不幸的是,OP 没有公开 MCVE。 因此,不清楚 OP 的 Widget 是如何实例化的。是成为主要 window 的小部件吗? Widget 的实例成为子实例的另一个小部件吗?

这只是猜测,但后者会解释 OP 所描述的内容。


为了证实我的猜测,我稍微修改了上面的代码:

  // setup GUI
  QWidget qMain0; // main window widget
  QWidget qMain(&qMain0); // child widget of main window widget

  qMain.setLayout(&qHBox);
  qMain0.show();
  // runtime loop
  return app.exec();

请注意,qMain 现在是 qMain0 的子级,但是当 qMain0 调整大小时,没有调整 qMain 大小的布局。

因此,在 window 调整大小时,视图的大小保持初始大小。