在 QWidget 内的 QGraphicsScene 内绘制
Draw inside a QGraphicsScene inside a QWidget
我想要一个 window(以 QWidget
的形式),其中包括右侧的菜单和左侧的图形区域。
尽管有许多网站解释了 QGraphicsScene
和 QGraphicsView
的多种使用方法,但我还是不知道该怎么做。
这里的 main.cpp
修改为独立工作:
#include <QApplication>
#include <QRectF>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPushButton>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QPalette>
int main (int argc, char * argv []) {
QApplication app (argc, argv) ;
// Main window
QWidget frame ;
frame.setFixedSize(750, 550) ;
frame.show() ;
// Right side, works ok
QWidget menu (&frame) ;
menu.setFixedSize(200, 500) ;
menu.move(550, 10) ;
QPalette pal = menu.palette() ;
pal.setColor(QPalette::Background, Qt::red) ;
menu.setPalette(pal) ; // I expected this to color the whole area
// to show the extent of the zone devoted to the menu,
// but it only outlines the button
menu.show() ;
QPushButton button ("Menu", &menu) ;
button.show() ; // I didn't think this was necessary,
// but the button didn't appear without this line
// Left side, nothing displayed
QVBoxLayout layout ;
QGraphicsScene * scene = new QGraphicsScene () ;
QGraphicsView view (scene) ;
layout.addWidget(&view) ;
QWidget canvas (&frame) ;
canvas.setLayout(&layout) ;
// I found this trick to include a QGraphicsScene inside a QWidget,
// I haven't had the opportunity to see whether it really works.
scene->addItem(new QGraphicsRectItem(10, 10, 20, 20)) ;
// The above line has no visible effect
view.show() ;
return app.exec() ;
}
我希望这会创建一个 window,在右侧放置一堆按钮(或者在我提供的 rediced 代码的情况下,只有一个按钮),然后在其上绘制一个矩形左侧,但它使整个左侧区域空白。
问题是否来自我如何将 QGraphicsView
放在 QWidget
中?还是因为其他原因无法绘制?我是否必须更新 QGraphicsView
以反映更改?它只是在可见范围之外吗?
最后,无法以任何方式绘制是否与整个应用程序在关闭时在 QWidget canvas (&frame) ;
行崩溃有关?
我刚刚稍微修复了你的程序,以便说明你可以使用 Qt 做什么以及你应该如何使用该框架。
我刚刚将 QPushButton 移到了 QMenuBar 中的 QAction。 QMenuBar 可以添加到 QMainWindow,这对于普通应用程序来说是合理的。
QMainWindow 的中央小部件包含 QGraphicsView。现在,您只是忘记了将 QGraphicsScene 与 QGraphicsView 连接起来。这就是在您看来看不到任何东西的原因。
QGraphicsView 和 QGraphicsScene 只是 MVC 模式的典型示例。您还可以添加另一个 QGraphicsView 并将其连接到同一个 QGraphicsScene。
您还应该使用 new 创建所有对象,因为 Qt 会自动处理 QObject 的所有子对象,如果它被删除或离开范围。
如果您对认真学习 Qt 真的很感兴趣,我建议您正在创建大量像这样的小示例程序。它真的帮了我很多。
#include <QApplication>
#include <QMenuBar>
#include <QGraphicsView>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QMainWindow>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
auto mainWindow = new QMainWindow;
auto menuBar = new QMenuBar;
auto menu = new QMenu("Menu");
auto action = new QAction("Action");
menu->addAction(action);
menuBar->addMenu(menu);
mainWindow->setMenuBar(menuBar);
auto frame = new QFrame;
frame->setLayout(new QVBoxLayout);
mainWindow->setCentralWidget(frame);
auto scene = new QGraphicsScene();
auto view=new QGraphicsView(scene);
view->setScene(scene); // That connects the view with the scene
frame->layout()->addWidget(view);
QObject::connect(action, &QAction::triggered, [&]() {
scene->addItem(new QGraphicsRectItem(10, 10, 20, 20));
});
mainWindow->show();
return app.exec();
}
我想要一个 window(以 QWidget
的形式),其中包括右侧的菜单和左侧的图形区域。
尽管有许多网站解释了 QGraphicsScene
和 QGraphicsView
的多种使用方法,但我还是不知道该怎么做。
这里的 main.cpp
修改为独立工作:
#include <QApplication>
#include <QRectF>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPushButton>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QPalette>
int main (int argc, char * argv []) {
QApplication app (argc, argv) ;
// Main window
QWidget frame ;
frame.setFixedSize(750, 550) ;
frame.show() ;
// Right side, works ok
QWidget menu (&frame) ;
menu.setFixedSize(200, 500) ;
menu.move(550, 10) ;
QPalette pal = menu.palette() ;
pal.setColor(QPalette::Background, Qt::red) ;
menu.setPalette(pal) ; // I expected this to color the whole area
// to show the extent of the zone devoted to the menu,
// but it only outlines the button
menu.show() ;
QPushButton button ("Menu", &menu) ;
button.show() ; // I didn't think this was necessary,
// but the button didn't appear without this line
// Left side, nothing displayed
QVBoxLayout layout ;
QGraphicsScene * scene = new QGraphicsScene () ;
QGraphicsView view (scene) ;
layout.addWidget(&view) ;
QWidget canvas (&frame) ;
canvas.setLayout(&layout) ;
// I found this trick to include a QGraphicsScene inside a QWidget,
// I haven't had the opportunity to see whether it really works.
scene->addItem(new QGraphicsRectItem(10, 10, 20, 20)) ;
// The above line has no visible effect
view.show() ;
return app.exec() ;
}
我希望这会创建一个 window,在右侧放置一堆按钮(或者在我提供的 rediced 代码的情况下,只有一个按钮),然后在其上绘制一个矩形左侧,但它使整个左侧区域空白。
问题是否来自我如何将 QGraphicsView
放在 QWidget
中?还是因为其他原因无法绘制?我是否必须更新 QGraphicsView
以反映更改?它只是在可见范围之外吗?
最后,无法以任何方式绘制是否与整个应用程序在关闭时在 QWidget canvas (&frame) ;
行崩溃有关?
我刚刚稍微修复了你的程序,以便说明你可以使用 Qt 做什么以及你应该如何使用该框架。
我刚刚将 QPushButton 移到了 QMenuBar 中的 QAction。 QMenuBar 可以添加到 QMainWindow,这对于普通应用程序来说是合理的。
QMainWindow 的中央小部件包含 QGraphicsView。现在,您只是忘记了将 QGraphicsScene 与 QGraphicsView 连接起来。这就是在您看来看不到任何东西的原因。
QGraphicsView 和 QGraphicsScene 只是 MVC 模式的典型示例。您还可以添加另一个 QGraphicsView 并将其连接到同一个 QGraphicsScene。
您还应该使用 new 创建所有对象,因为 Qt 会自动处理 QObject 的所有子对象,如果它被删除或离开范围。
如果您对认真学习 Qt 真的很感兴趣,我建议您正在创建大量像这样的小示例程序。它真的帮了我很多。
#include <QApplication>
#include <QMenuBar>
#include <QGraphicsView>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QMainWindow>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
auto mainWindow = new QMainWindow;
auto menuBar = new QMenuBar;
auto menu = new QMenu("Menu");
auto action = new QAction("Action");
menu->addAction(action);
menuBar->addMenu(menu);
mainWindow->setMenuBar(menuBar);
auto frame = new QFrame;
frame->setLayout(new QVBoxLayout);
mainWindow->setCentralWidget(frame);
auto scene = new QGraphicsScene();
auto view=new QGraphicsView(scene);
view->setScene(scene); // That connects the view with the scene
frame->layout()->addWidget(view);
QObject::connect(action, &QAction::triggered, [&]() {
scene->addItem(new QGraphicsRectItem(10, 10, 20, 20));
});
mainWindow->show();
return app.exec();
}