具有布局、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 调整大小时,视图的大小保持初始大小。
我正在尝试绘制各种形状,如矩形、椭圆、文本等 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 调整大小时,视图的大小保持初始大小。