【问题标题】:Is it possible to use QGraphicsLayout in an application with a QMainWindow?是否可以在带有 QMainWindow 的应用程序中使用 QGraphicsLayout?
【发布时间】:2018-03-06 06:43:01
【问题描述】:

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

作为测试,我使用 Qt 基本图形布局示例中提供的工作代码,在 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();
}

【问题讨论】:

  • 假设您的代码中的 Window 实际上是 QMainWindow 或继承自 QMainWindow,我假设您需要以不同的方式构造视图 a,例如:Window window; window.resize(600, 600); QGraphicsScene scene; QGraphicsView view(&scene); window.setCentralWidget(&view); window.show(); 这将设置QGraphicsView 包含 QGraphicsScene 作为中心小部件。
  • Window 是一个 QGraphicsWidget。它在这些布局中包含 QGraphicsLayouts 和 QGraphicsItems。我这里没有贴出代码,因为我使用的是 Qt Basic Graphics Layouts Example 作为起点。

标签: c++ qt5 qmainwindow qgraphicswidget


【解决方案1】:

这里有个问题:

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() 在程序准备好之前不会返回退出...因此示例程序中的对象在程序退出之前不会被销毁)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多