是否可以在带有 QMainWindow 的应用程序中使用 QGraphicsLayout?
Is it possible to use QGraphicsLayout in an application with a QMainWindow?
我希望做的是有一个标准的 QMainWindow class,带有菜单、工具栏以及布局中的各种小部件,其中之一是显示图形小部件的图形视图包含图形布局。但是每当我将图形视图放入主 window 时,什么都不会显示。如果我使用包含 main() 函数内部布局的图形小部件创建我的图形视图,那么一切都是可见的。
作为测试,我采用了 Qt 基本图形布局示例中提供的工作代码,在 main 中创建了一个 QMainWindow class,并移动了 QGraphicsScene、Window 和 QGraphicsView主要创作 window class.
我自己测试了主要 window class,行编辑之类的小部件显示正常。但是下面的代码,取自示例中的 main,在 main window class.
中不再有效
QGraphicsScene scene;
Window *window = new Window;
scene.addItem(window);
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
我刚得到一个空白区域。如果我不添加 Window 小部件,而是绘制一个椭圆,那么它是可见的。如果我添加一个带有背景色的普通 QGraphicsWidget,那么它也是可见的。只是当东西在图形小部件的布局内时,我什么也得不到。我一直在寻找答案,深入研究文档,甚至查看 Qt 源代码,看看我是否能弄清楚我正在尝试做的事情是否可行,但没有任何运气。
我的主要window:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QGraphicsScene scene;
Window *window = new Window;
window->resize(600, 600);
scene.addItem(window);
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
setCentralWidget(&view);
resize(600,600);
}
主要代码:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
这里有一个问题:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
[...]
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
[...]
}
您已经在堆栈上声明了 view
小部件,这意味着它会在您的 MainWindow
构造函数 return 后立即自动销毁,因此用户永远不会看见。你应该做的是这样的:
QGraphicsView * view = new QGraphicsView(&scene, this);
view->resize(600, 600);
view->show();
您的 QGraphicsScene 对象也会遇到类似的问题:
QGraphicsScene scene;
...因为在constructor-method里面也是声明为局部变量,所以在constructor-methodreturn的时候也会被销毁,让你没戏了。我建议改用 class-member 变量;这样它就会和你的 MainWindow
一样长。
(请注意,在您从中复制的 example-program 中声明堆栈上的项目,只是因为它们是直接在 main() 方法中声明的,而 main() 没有 return 直到程序准备好退出...因此示例程序中的对象在程序退出之前不会被销毁)
我希望做的是有一个标准的 QMainWindow class,带有菜单、工具栏以及布局中的各种小部件,其中之一是显示图形小部件的图形视图包含图形布局。但是每当我将图形视图放入主 window 时,什么都不会显示。如果我使用包含 main() 函数内部布局的图形小部件创建我的图形视图,那么一切都是可见的。
作为测试,我采用了 Qt 基本图形布局示例中提供的工作代码,在 main 中创建了一个 QMainWindow class,并移动了 QGraphicsScene、Window 和 QGraphicsView主要创作 window class.
我自己测试了主要 window class,行编辑之类的小部件显示正常。但是下面的代码,取自示例中的 main,在 main window class.
中不再有效QGraphicsScene scene;
Window *window = new Window;
scene.addItem(window);
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
我刚得到一个空白区域。如果我不添加 Window 小部件,而是绘制一个椭圆,那么它是可见的。如果我添加一个带有背景色的普通 QGraphicsWidget,那么它也是可见的。只是当东西在图形小部件的布局内时,我什么也得不到。我一直在寻找答案,深入研究文档,甚至查看 Qt 源代码,看看我是否能弄清楚我正在尝试做的事情是否可行,但没有任何运气。
我的主要window:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QGraphicsScene scene;
Window *window = new Window;
window->resize(600, 600);
scene.addItem(window);
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
setCentralWidget(&view);
resize(600,600);
}
主要代码:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
这里有一个问题:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
[...]
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();
[...]
}
您已经在堆栈上声明了 view
小部件,这意味着它会在您的 MainWindow
构造函数 return 后立即自动销毁,因此用户永远不会看见。你应该做的是这样的:
QGraphicsView * view = new QGraphicsView(&scene, this);
view->resize(600, 600);
view->show();
您的 QGraphicsScene 对象也会遇到类似的问题:
QGraphicsScene scene;
...因为在constructor-method里面也是声明为局部变量,所以在constructor-methodreturn的时候也会被销毁,让你没戏了。我建议改用 class-member 变量;这样它就会和你的 MainWindow
一样长。
(请注意,在您从中复制的 example-program 中声明堆栈上的项目,只是因为它们是直接在 main() 方法中声明的,而 main() 没有 return 直到程序准备好退出...因此示例程序中的对象在程序退出之前不会被销毁)