[C++]在VS2017中,添加Qt的ui文件,编译运行opencv+qt5程序的过程

在基于C++的opencv编程过程中,为了满足以后的跨平台需求,同时为了简单高效,选择Qt作为界面。

1.下载opencv,并且配置opencv到VS2017中(略):

2.Qt5以及VS2017对应的Qt插件的安装:

注意:最好是按照qt5,安装qt6运行程序会报几百个错误

使用VS2017编写QT GUI程序
在VS2017中下载插件时,速度感人,最好是先把Qt插件下载下来(下载后为.VSIX文件),在进行安装,参考下面博客:
Visual Studio2019安装vsix扩展文件

3.添加项目

选择解决方案=》添加=》Add Qt Class…=》QT Weights Class,创建.ui,.h和.cpp文件
在这里插入图片描述

4.设置QT designer,使QT能够打开VS中的.ui文件

点击右侧的UI文件,选择打开方式=》添加

在这里插入图片描述

程序:选择QT版本的安装目录“D:\All_kinds_of_software\QT5.9\5.9\msvc2017_64\bin”
bin文件夹下有个designer.exe, 选中即可,添加完成中设置为默认值,然后确定
在这里插入图片描述
之后,双击.ui文件,就可以打开Qt界面,进行设置了。

5.设置Qt VS Tools,使VS能够编译.ui文件

Qt VS Tools=》Qt Versions=>选择对应的qmake文件

在这里插入图片描述
在这里插入图片描述

6.引入Qt的include目录:

方案一:比较麻烦
VS中新建Qt项目工程后显示无法打开源文件“QtWidgets/QApplication”的解决方案
方案二:正如博主所说,一劳永逸
VS中写Qt程序新建工程后显示无法打开源文件“QtWidgets/QApplication” 和标红问题

7.在VS2017中,添加配置,使.ui文件能够自动生成.h文件。

VS2015编译QT的ui文件
这里添加用户宏为:
在这里插入图片描述
右击当前项目=》添加=》添加现有项=》选中GeneratedFiles目录下生成的.h和.cpp文件,将其导入到项目中来。
在这里插入图片描述

8.相关错误:

所有配置完成,且程序编程好了之后,运行程序,qnamespace.h报几百个错误:
Qt6运行报qnamespace.h几百个错
解决方案:用qt5.15,qt6阉割了很多类,这里使用qt5.19
Qt下载(多种下载通道+所有版本)

出现错误:error : [QtRunWork] Error starting process /rcc: 系统找不到指定的文件。右击打开下面文件页面,进行设置。在这里插入图片描述可参考博客:
[QtRunWork] Error starting process /uic:

出现问题:vs2017无法打开qt源文件,没有引入Qt目录。
解决方案:
方案一:比较麻烦
VS中新建Qt项目工程后显示无法打开源文件“QtWidgets/QApplication”的解决方案
方案二:正如博主所说,一劳永逸
VS中写Qt程序新建工程后显示无法打开源文件“QtWidgets/QApplication” 和标红问题
配置完成后,关闭项目,重新打开,红线就会消失。

出现问题:error MSB6006: “cmd.exe”已退出,代码为 123

本人解决方案:
最快的办法是删除该.ui文件,以及对应.h和.cpp文件。重新建一个不重名的Qt类,包含.ui文件.h和.cpp文件,然后,点击.ui文件,在属性中进行设置后,进行编译,就可以编译成功。实在不行,就删除项目,重新创建一个项目就好了。

9.具体实现如下:

代码参考:VS2010+QT5.1+opencv2.4.5图像界面第一个程序
流程图:
在这里插入图片描述
生成的testTranslateQtUi.ui在Qt中的设计为:
在这里插入图片描述设计完成之后,点击保存,然后选中testTranslateQtUi.ui文件,右击,选择编译,编译出的ui_testTranslateQtUi.h为下述代码,然后点击项目,添加现有项,选择该ui,添加到VS中:

/********************************************************************************
** Form generated from reading UI file 'testTranslateQtUi.ui'
**
** Created by: Qt User Interface Compiler version 5.9.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_TESTTRANSLATEQTUI_H
#define UI_TESTTRANSLATEQTUI_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_testTranslateQtUi
{
public:
    QPushButton *pushBt_openImage;
    QPushButton *pushBt_reset;
    QPushButton *pushBt_flipImage;

    void setupUi(QWidget *testTranslateQtUi)
    {
        if (testTranslateQtUi->objectName().isEmpty())
            testTranslateQtUi->setObjectName(QStringLiteral("testTranslateQtUi"));
        testTranslateQtUi->resize(1200, 537);
        pushBt_openImage = new QPushButton(testTranslateQtUi);
        pushBt_openImage->setObjectName(QStringLiteral("pushBt_openImage"));
        pushBt_openImage->setGeometry(QRect(20, 80, 111, 41));
        pushBt_reset = new QPushButton(testTranslateQtUi);
        pushBt_reset->setObjectName(QStringLiteral("pushBt_reset"));
        pushBt_reset->setGeometry(QRect(20, 280, 101, 41));
        pushBt_flipImage = new QPushButton(testTranslateQtUi);
        pushBt_flipImage->setObjectName(QStringLiteral("pushBt_flipImage"));
        pushBt_flipImage->setGeometry(QRect(20, 200, 112, 34));

        retranslateUi(testTranslateQtUi);
        QObject::connect(pushBt_openImage, SIGNAL(clicked()), testTranslateQtUi, SLOT(OpenImageClicked()));
        QObject::connect(pushBt_reset, SIGNAL(clicked()), testTranslateQtUi, SLOT(ResetClicked()));
        QObject::connect(pushBt_flipImage, SIGNAL(clicked()), testTranslateQtUi, SLOT(FlipImageClicked()));

        QMetaObject::connectSlotsByName(testTranslateQtUi);
    } // setupUi

    void retranslateUi(QWidget *testTranslateQtUi)
    {
        testTranslateQtUi->setWindowTitle(QApplication::translate("testTranslateQtUi", "testTranslateQtUi", Q_NULLPTR));
        pushBt_openImage->setText(QApplication::translate("testTranslateQtUi", "openImage", Q_NULLPTR));
        pushBt_reset->setText(QApplication::translate("testTranslateQtUi", "reset", Q_NULLPTR));
        pushBt_flipImage->setText(QApplication::translate("testTranslateQtUi", "flipImage", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class testTranslateQtUi: public Ui_testTranslateQtUi {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_TESTTRANSLATEQTUI_H

自动生成的testTranslateQtUi.h,并且此时,已经自动进入了ui_testTranslateQtUi.h头文件,这里对其进行了相应修改,添加私有变量和自定义槽函数:

#pragma once

#include <QWidget>
#include "ui_testTranslateQtUi.h"
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include"opencv_modules.hpp"
#include "qmessagebox.h"


class testTranslateQtUi : public QWidget
{
	Q_OBJECT

public:
	testTranslateQtUi(QWidget *parent = Q_NULLPTR);
	~testTranslateQtUi();

private:
	Ui::testTranslateQtUi ui;
	cv::Mat img;//定义私有变量 image
	cv::Mat result;//定义私有变量result
	
	

private slots: //声明信号函数
	void OpenImageClicked();
	void ResetClicked();
	void FlipImageClicked();

};

生成的testTranslateQtUi.cpp,已自动引入testTranslateQtUi.h头文件。可以进行程序的编写:

#include "testTranslateQtUi.h"
#include"qlabel.h"

testTranslateQtUi::testTranslateQtUi(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
}

testTranslateQtUi::~testTranslateQtUi()
{

}

void testTranslateQtUi::OpenImageClicked()
{
	img = cv::imread("Image/image_22.jpeg");
	//图像在QT显示前,必须转化成QImage格式,将RGB转化成RGBA格式
	cv::cvtColor(img, img,cv::COLOR_BGR2RGBA);
	
	QImage image = QImage((const unsigned char*)(img.data),
		img.cols, img.rows, QImage::Format_RGB32);
	QLabel *label1 = new QLabel(this);
	label1->move(150, 50);
	label1->setPixmap(QPixmap::fromImage(image));
	//pixmap的大小就是label的大小
	label1->resize(label1->pixmap()->size());
	label1->show();
}

void testTranslateQtUi::ResetClicked()
{
	//this->ui.pushBt_flipImage->setDisabled(true);
	QMessageBox::critical(0, "warning message", "Do you want to reset?", QMessageBox::Ok | QMessageBox::Default, QMessageBox::Cancel | QMessageBox::Escape, 0);
}
void   testTranslateQtUi::FlipImageClicked()
{
	cv::flip(img, result, 1);//对图像进行翻转
	QImage image = QImage((const unsigned char*)(result.data),
		result.cols, result.rows, QImage::Format_RGB32);
	QLabel *label2 = new QLabel(this);
	label2->move(520, 50);
	label2->setPixmap(QPixmap::fromImage(image));
	label2->resize(label2->pixmap()->size());
	label2->show();
	
}

最后,main.cpp中引用了testTranslateQtUi.h,虽然没有用到主函数,但是必须有。

#include"testTranslateQtUi.h"
#include <QtWidgets/QApplication>



int main(int argc, char *argv[])
{
	
    QApplication a(argc, argv);
   testTranslateQtUi w;
    w.show();
    return a.exec();
}

10.运行结果:

在这里插入图片描述

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值