【问题标题】:Best practice to handle multiple documents in QMdiArea?在 QMdiArea 中处理多个文档的最佳实践?
【发布时间】:2012-10-28 07:57:54
【问题描述】:

我需要设计和开发一种图形软件,可以编辑包含图形元素等的自定义文件。

由于QMdiArea 实际上是我在QMainWindow 中的中心小部件,我希望该软件包含许多文档。

对于每个文档,我还需要 QGraphicsViewQGraphicsScene,因为它们可以协同工作。

现在,我的问题是,我应该将带有受保护/私有成员的QGraphicsView 继承到它自己的QGraphicsScene,还是应该创建一个继承QWidget 并处理QGraphicsView / QGraphicsScene 实例的类?

或者还有什么我没有想到的解决方案?

【问题讨论】:

    标签: qt qgraphicsview qgraphicsscene qmainwindow qmdiarea


    【解决方案1】:

    首先,我认为您不需要 QWidget 来管理 QGraphicsScene 和 QGraphicsView。考虑到这一点,“最佳实践”通常是尽可能避免子类化。最终,您可能必须继承 QGraphicsView (如果您想更改其默认功能),但您的问题中没有任何内容暗示您现在需要。另请注意,有一个函数QGraphicsView::scene() 返回视图的当前场景,因此无需将场景设为成员(它已经是)。

    如果您需要访问特定视图或场景,可以执行以下操作:

    MainWindow::onActionClearActiveWindow() // just an example
    {
        QMdiArea *myMdiArea = static_cast<QMdiArea*>(centralWidget());
        QGraphicsView *activeView = static_cast<QGraphicsView*>(myMdiArea->widget());
        QGraphicsScene *activeScene = activeView->scene();
        activeScene->clear();
    }
    

    另见QMdiArea::subWindowList(),它返回所有子窗口的列表。

    【讨论】:

    • 但是QGraphicsViewscene 成员设置为null,不是吗?这就是为什么我正在考虑对整个东西进行子类化并因此创建自定义场景对象等。无论如何感谢您的帮助!
    • 第一次构造 QGraphicsView 时,scene 成员为 null,但您可以只使用 view-&gt;setScene(new QGraphicsScene)。这将为视图创建一个场景,然后您可以通过调用 view-&gt;scene() 获得指向该场景的指针。
    • Anthony,我还有一个问题:我将继承QGraphicsScene,所以我会给它一些自定义行为,而且我必须处理一组项目。我应该继续使用QGraphicsScene / QGraphicsView 还是处理一个将它们都封装在属性中的类更好?
    • 是的,一定要保留 QGraphicsScene 和 QGraphicsView!这正是他们的目的。我认为最好使用它们并将它们分开,而不是创建一个类来处理场景和视图行为。顺便说一句,我认为继承 QGraphicsScene 是很正常的。
    • 所以,你认为我应该继承 QGraphicsScene 并因此向其中添加属性 - 例如文件是否已保存 - 不是吗?我对这个想法很满意,但我肯定在寻找最佳解决方案。最后,我对QGraphicsView 进行了子类化,所以我在不添加QGraphicsScene 的情况下绘制了一个周围的矩形,这就是我想做的原因。您如何看待这些做法?
    猜你喜欢
    • 2023-04-08
    • 2019-03-11
    • 1970-01-01
    • 2019-04-25
    • 2021-12-23
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多