在 QWidget 内的 QGraphicsScene 内绘制

Draw inside a QGraphicsScene inside a QWidget

我想要一个 window(以 QWidget 的形式),其中包括右侧的菜单和左侧的图形区域。 尽管有许多网站解释了 QGraphicsSceneQGraphicsView 的多种使用方法,但我还是不知道该怎么做。

这里的 main.cpp 修改为独立工作:

#include <QApplication>
#include <QRectF>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPushButton>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QPalette>

int main (int argc, char * argv []) {
    QApplication app (argc, argv) ;

// Main window
    QWidget frame ;
    frame.setFixedSize(750, 550) ;
    frame.show() ;

// Right side, works ok
    QWidget menu (&frame) ;
    menu.setFixedSize(200, 500) ;
    menu.move(550, 10) ;
    QPalette pal = menu.palette() ;
    pal.setColor(QPalette::Background, Qt::red) ;
    menu.setPalette(pal) ; // I expected this to color the whole area 
    // to show the extent of the zone devoted to the menu,
    // but it only outlines the button
    menu.show() ;
    QPushButton button ("Menu", &menu) ;
    button.show() ; // I didn't think this was necessary,
    // but the button didn't appear without this line

// Left side, nothing displayed
    QVBoxLayout layout ;
    QGraphicsScene * scene = new QGraphicsScene () ;
    QGraphicsView view (scene) ;
    layout.addWidget(&view) ;
    QWidget canvas (&frame) ;
    canvas.setLayout(&layout) ;
    // I found this trick to include a QGraphicsScene inside a QWidget,
    // I haven't had the opportunity to see whether it really works.
    scene->addItem(new QGraphicsRectItem(10, 10, 20, 20)) ;
    // The above line has no visible effect
    view.show() ;

    return app.exec() ;
}

我希望这会创建一个 window,在右侧放置一堆按钮(或者在我提供的 rediced 代码的情况下,只有一个按钮),然后在其上绘制一个矩形左侧,但它使整个左侧区域空白。 问题是否来自我如何将 QGraphicsView 放在 QWidget 中?还是因为其他原因无法绘制?我是否必须更新 QGraphicsView 以反映更改?它只是在可见范围之外吗? 最后,无法以任何方式绘制是否与整个应用程序在关闭时在 QWidget canvas (&frame) ; 行崩溃有关?

我刚刚稍微修复了你的程序,以便说明你可以使用 Qt 做什么以及你应该如何使用该框架。

我刚刚将 QPushButton 移到了 QMenuBar 中的 QAction。 QMenuBar 可以添加到 QMainWindow,这对于普通应用程序来说是合理的。

QMainWindow 的中央小部件包含 QGraphicsView。现在,您只是忘记了将 QGraphicsScene 与 QGraphicsView 连接起来。这就是在您看来看不到任何东西的原因。

QGraphicsView 和 QGraphicsScene 只是 MVC 模式的典型示例。您还可以添加另一个 QGraphicsView 并将其连接到同一个 QGraphicsScene。

您还应该使用 new 创建所有对象,因为 Qt 会自动处理 QObject 的所有子对象,如果它被删除或离开范围。

如果您对认真学习 Qt 真的很感兴趣,我建议您正在创建大量像这样的小示例程序。它真的帮了我很多。

#include <QApplication>
#include <QMenuBar>
#include <QGraphicsView>
#include <QVBoxLayout>
#include <QGraphicsRectItem>
#include <QMainWindow>

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    auto mainWindow = new QMainWindow;
    auto menuBar = new QMenuBar;
    auto menu = new QMenu("Menu");
    auto action = new QAction("Action");
    menu->addAction(action);
    menuBar->addMenu(menu);
    mainWindow->setMenuBar(menuBar);

    auto frame = new QFrame;
    frame->setLayout(new QVBoxLayout);
    mainWindow->setCentralWidget(frame);

    auto scene = new QGraphicsScene();
    auto view=new QGraphicsView(scene);
    view->setScene(scene); // That connects the view with the scene
    frame->layout()->addWidget(view);

    QObject::connect(action, &QAction::triggered, [&]() {
        scene->addItem(new QGraphicsRectItem(10, 10, 20, 20));
    });
    mainWindow->show();

    return app.exec();
}