是否可以在带有 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 直到程序准备好退出...因此示例程序中的对象在程序退出之前不会被销毁)