在Qt中理解QGraphicsScene

时间:2015-10-01 09:55:25

标签: qt

我想了解Qt的基础知识。在浏览了一些帖子之后,我发现ui_mainwindow.hUIC tool创建,而ui_mainwindow.h包含有关我创建的表单/ ui的信息。

在我的GUI中,我采用了按钮和图形视图。我希望在graphicsView中显示一个简单的图像(我在程序内部创建)。我试图用两种方式(出于学习目的)这样做:

  • 我可以在on_pushButton_clicked()内写代码(即我的push_button的插槽)。
  • 我正在尝试从main()
  • 中提取图片

问题:我完成了第一种方法。我在on_pushButton_clicked()中使用了以下代码行,但它确实有效。

void MainWindow::on_pushButton_clicked()
{    
    //Display image in the graphics viewer
    Mat img(200,200, CV_8UC3, Scalar(255,0,0));
    QImage image( img.data, img.cols, img.rows, img.step, QImage::Format_RGB888 );

    QGraphicsScene* scene = new QGraphicsScene();
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
    scene->addItem(item);
    ui->graphicsView->setScene(scene);
}

现在,我想从main()做类似的事情。为此,现在我的main()看起来如下:

#include "mainwindow.h"
#include <QApplication>

//For image
#include <QImage>
#include <QPixmap>
#include <QGraphicsPixmapItem>
//#include "ui_mainwindow.h"

//OPENCV Headers
#include <opencv2/opencv.hpp> 
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //Display image in the graphics viewer
    Mat img(200,200, CV_8UC3, Scalar(255,0,0));
    QImage image( img.data, img.cols, img.rows, img.step, QImage::Format_RGB888 );

    QGraphicsScene* scene = new QGraphicsScene();
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
    scene->addItem(item);
    w.ui->graphicsView->setScene(scene);

    w.show();
    return a.exec();
}

如果我将main()放在#include "ui_mainwindow.h"中,则main.cpp内写的上述代码可以正常工作。但是,如果我对#include "ui_mainwindow.h"w.ui->graphicsView->setScene(scene);发表评论,则会为QGraphicsScene* scene = new QGraphicsScene();引发错误。

错误为main.cpp:32: error: allocation of incomplete type 'QGraphicsScene' QGraphicsScene* scene = new QGraphicsScene();

问题:为什么QGraphicsScene"ui_mainwindow.h"之间存在联系。我知道我需要"ui_mainwindow.h"w.ui->graphicsView->setScene(scene);,因为我使用的是ui,但我不了解QGraphicsScene的必要性。

1 个答案:

答案 0 :(得分:1)

如果您只想绘制静态图像,最好只使用QLabel并设置一些图像

QImage *image = new QImage (":/prefix/image/vl.jpg" );
QLabel *magelab = new QLabel();
magelab->setPixmap(QPixmap::fromImage(*image));

通常QGraphicsScene更好地使用连接QGraphicsView.这意味着QGraphicsViewQGraphicsScene设置一些对象(场景)就像:

class SomeObject : public QGraphicsView 
{
    Q_OBJECT
public:
    explicit Schemat(QWidget *parent = 0);

private:
    QGraphicsScene *scene;


};

和来源

Schemat::Schemat( QWidget *parent) : QGraphicsView(parent)
{

    scene = new QGraphicsScene(this);
    this->setScene(scene);
   // to Your scene You can add some image for example
    scene->addPixmap(SOME_PIXMAP)

}

然后您创建主窗口并使用QGraphicsView添加,例如作为某个部分QGroupBox

void MainWindow::SetupSchemat()
{
    schema = new Schemat();
    QGroupBox *schbox;
    QHBoxLayout *hschbox;
    schbox = new QGroupBox(this); 
    hschbox = new QHBoxLayout(this);
    schbox->setTitle("SomeScene");
    hschbox->addWidget(schema); //add scene to layout
    schbox->setLayout(hschbox);
}

QGraphicsScene就像你的MainWindow的某些部分,你可以制作一些动画,你可以画画。 QGraphicsScene更好用,如果你想要使用动画不仅静态图像它提供更多选项来操纵图像(前缩放,捕捉鼠标点击,通过协调其他对象管理),其他对象每个应该是动画或只是显示。要QGraphicsScene您可以依次添加一些 QGraphicsItem QGraphicsItem可以移动到QGraphicsScene,并且具有明确定义的特定条件或流程。 QGraphicsViewQGraphicsSceneQGraphicsItem一起可以在某个部分创建动画或仅创建图像您的主窗口。

也很好解释你会在这里找到

https://www.youtube.com/watch?v=fmSs2mNGh9I