是否可以在具有QMainWindow的应用程序中使用QGraphicsLayout?

时间:2018-03-06 06:43:02

标签: c++ qt5 qmainwindow qgraphicswidget

我希望做的是有一个标准的QMainWindow类,其中包含菜单,工具栏以及布局中的各种小部件,其中一个是显示包含图形布局的图形小部件的图形视图。但每当我将图形视图放入主窗口时,都不会显示任何内容。如果我使用包含main()函数内部布局的图形小部件创建我的图形视图,那么一切都是可见的。

作为测试,我使用了Qt Basic Graphics Layouts示例中提供的工作代码,在main中创建了一个QMainWindow类,并将QGraphicsScene,Window和QGraphicsView创建移动到主窗口类。

我自己测试了主窗口类,像行编辑这样的小部件显示得很好。但是下面的代码,取自示例中的main,在主窗口类中不再有效。

QGraphicsScene scene;

Window *window = new Window;
scene.addItem(window);
QGraphicsView view(&scene);
view.resize(600, 600);
view.show();

我只是得到一个空白区域。如果我没有添加Window小部件,而是例如绘制一个椭圆,那么这是可见的。如果我添加一个带有背景颜色的普通QGraphicsWidget,那么这也是可见的。只是当事物在图形小部件的布局中时,我什么也得不到。我一直在寻找答案,深入研究文档,甚至查看Qt源代码,看看我能否弄清楚我想做的事情是否可行,但没有任何运气。

我的主窗口:

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();
}

1 个答案:

答案 0 :(得分:0)

这里有一个问题:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
   [...]

   QGraphicsView view(&scene);
   view.resize(600, 600);
   view.show();

   [...]
}

你已经在堆栈上声明了view小部件,这意味着一旦你的MainWindow构造函数返回它就会被自动销毁,因此用户永远不会看到它。你应该做的是这样的事情:

QGraphicsView * view = new QGraphicsView(&scene, this);
view->resize(600, 600);
view->show();

你的QGraphicsScene对象会遇到类似的问题:

QGraphicsScene scene;

...因为它也在构造函数方法中被声明为局部变量,所以当构造函数方法返回时它也会被销毁,不会让你没有场景。我建议改为使用类成员变量;这样,它会持续MainWindow所用的时间。

(请注意,声明堆栈中的项目在您复制的示例程序中起作用,仅因为它们是直接在main()方法中声明的,而main()在程序准备好之前不会返回退出...因此,在程序退出之前,示例程序中的对象不会被销毁。