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

编程入门 行业动态 更新时间:2024-10-27 20:28:42

[C++]在VS2017中,添加Qt的ui文件,编译运行opencv+qt5程序的<a href=https://www.elefans.com/category/jswz/34/1769466.html style=过程"/>

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

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

VS2017+opencv2+qt5.9的配置运行过程(包含一个小demo)

  • 1.下载opencv,并且配置opencv到VS2017中(略):
  • 2.Qt5以及VS2017对应的Qt插件的安装:
  • 3.添加项目
  • 4.设置QT designer,使QT能够打开VS中的.ui文件
  • 5.设置Qt VS Tools,使VS能够编译.ui文件
  • 6.引入Qt的include目录:
  • 7.在VS2017中,添加配置,使.ui文件能够自动生成.h文件。
  • 8.相关错误:
  • 9.具体实现如下:
  • 10.运行结果:

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_NAMESPACEclass 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);} // setupUivoid 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 UiQT_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_OBJECTpublic:testTranslateQtUi(QWidget *parent = Q_NULLPTR);~testTranslateQtUi();private:Ui::testTranslateQtUi ui;cv::Mat img;//定义私有变量 imagecv::Mat result;//定义私有变量resultprivate 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.运行结果:

更多推荐

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

本文发布于:2024-02-10 20:20:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1677089.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:过程   文件   程序   Qt   ui

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!