【问题标题】:No updating on QGraphicsView and QGraphicsSceneQGraphicsView 和 QGraphicsScene 没有更新
【发布时间】:2015-07-14 18:21:35
【问题描述】:

我今年开始学习 Qt,这是我喜欢使用的东西,我在 C++ 方面提高了很多知识。我正在做一个长期项目,我正在使用蛇算法,我正在使用 Qt 来设计界面。我已经创建了所有布局,我遇到的问题不是设计而是 QGraphicsView 和 QGraphicsScene 没有更新我不明白为什么。我想使用一个函数通过单击一个按钮在图片上添加文本,并且我的代码正在编译而没有错误,但是当我单击该按钮时崩溃了。

这里只是我用来做我想做的部分代码:

MainWindow.cpp

/*All includes done, the list is long*/

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    ...
    QImage image1("2.jpg");

    QGraphicsPixmapItem *item = new QGraphicsPixmapItem;
    item->setPixmap(QPixmap::fromImage(image1));

    QGraphicsScene *scene = new QGraphicsScene;
    scene->addItem(item);
    //scene->addLine(QLineF(256, 256, 20, 20));
/*HERE, if I uncomment this line above, the line will be added correctly without problems*/

    QGraphicsView *view = new QGraphicsView;
    view->setScene(scene);

    ...
    QPushButton *imageProcessing1 = new QPushButton("Image Processing 1");
    QObject::connect( imageProcessing1, SIGNAL(clicked()), this, SLOT(testt()));
   ...
}

void MainWindow::testt()
{
    scene->addLine(QLineF(256, 256, 20, 20));
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QImage>
#include <QGraphicsPixmapItem>

class ProjectWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    QGraphicsScene *scene;


public slots:
    void runSnakes();
    void drawCircle(int x, int y);
    void testt();

};

#endif // MAINWINDOW_H

main.cpp

#include "winimage.h"
#include "snakes.h"
#include <iostream> // standard C++ I/O
#include <fstream>
#include <windows.h>
#include "mainwindow.h"
#include <QApplication>

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

    QApplication app(argc, argv);

    auto win = new MainWindow;
    win->show();

    return app.exec();
}

所以,我想了解它为什么会崩溃?我对函数“testt”做错了吗?我的意思是,这可能不是我应该做的。我在使用QFileDialog加载图像时也遇到了这个问题,并且图像根本没有显示,并且仍然没有解决,我看了很多方法,它根本不起作用。

提前感谢您阅读我的问题并帮助我。如果需要,我可以通过私人邮件发送整个项目(仅源文件)。

【问题讨论】:

  • Qt Creator 是一个 IDE,它与问题无关。

标签: c++ qt


【解决方案1】:

这一行:

QGraphicsScene *scene = new QGraphicsScene;

在局部变量中创建场景。它不会触及MainWindow::scene,它保持为空或未初始化。

然后您继续在MainWindow::testt 中使用MainWindow::scene,这会崩溃,因为您使用的是未初始化的指针或空指针,具体取决于您是否使用智能指针。

如果您没有无缘无故地使用手动内存管理,那么所有这些问题都可以避免。也就是说:

界面

class MainWindow : public QMainWindow {
  Q_OBJECT
  QWidget m_centralWidget;
  QGridLayout m_centralLayout;
  QGraphicsScene m_scene;
  QGraphicsView m_view;
  QPushButton m_imageProcessing1;
  ...
public:
  MainWindow(QWidget * parent = 0);
  Q_SLOT void testt();
}

实施

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent),
    m_centralLayout(&m_centralWidget),
    m_imageProcessing1("Image Processing 1")
{
    setCentralWidget(&m_centralWidget);
    m_centralLayout.addWidget(&m_view, 0, 0);
    m_centralLayout.addWidget(&m_imageProcessing1, 1, 0);
    m_view.setScene(scene);
    connect(&m_imageProcessing1, SIGNAL(clicked()), SLOT(testt()));
    auto item = new QGraphicsPixmapItem(QPixmap("2.jpg")));   
    m_scene.addItem(item);   
    ...
}

void MainWindow::testt()
{
    m_scene.addLine(QLineF(256, 256, 20, 20));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow win;
    win.show();
    return app.exec();
}

【讨论】:

    【解决方案2】:

    在您的代码中,void MainWindow::testt() 中使用的指针 scene 未分配。

    MainWindow 构造函数中的声明从QGraphicsScene *scene = new QGraphicsScene; 更改为scene = new QGraphicsScene;

    这将解决您的崩溃问题!

    【讨论】:

      【解决方案3】:

      好的,我知道创建新小部件的两种方法,但我误解了它,现在我明白了。但是,这意味着最好不要使用局部变量并以这种方式定义每个新的小部件scene = new QGraphicsScene,这样我就不会出现崩溃问题?

      好的,非常感谢你们两位!它正在工作,而且我还解决了在 QGraphicsView 上加载图片的问题,因为我定义小部件的方式不好。我已解决此主题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 2013-11-19
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2011-06-26
        相关资源
        最近更新 更多