我想了解Qt的基础知识。在浏览了一些帖子之后,我发现ui_mainwindow.h
由UIC 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
的必要性。
答案 0 :(得分:1)
如果您只想绘制静态图像,最好只使用QLabel
并设置一些图像
QImage *image = new QImage (":/prefix/image/vl.jpg" );
QLabel *magelab = new QLabel();
magelab->setPixmap(QPixmap::fromImage(*image));
通常QGraphicsScene
更好地使用连接QGraphicsView.
这意味着QGraphicsView
从QGraphicsScene
设置一些对象(场景)就像:
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
,并且具有明确定义的特定条件或流程。 QGraphicsView
,QGraphicsScene
和QGraphicsItem
一起可以在某个部分创建动画或仅创建图像您的主窗口。
也很好解释你会在这里找到