VS2019 Qt5.14 学习

目录

初始配置,opencv + VS019 + QT5.14

程序打包

 Hello World

槽函数

1. 信号

2. 槽

3. 信号与槽的连接

4. 特点

Qlabel 显示opencv 图片

实例1 字体修改

复制操作

QCheckBox,可以重复选择,效果叠加

QRationButton,只能单选

 代码

实例2 File APP


初始配置,opencv + VS019 + QT5.14

#include "wjd.h"
#include <QtWidgets/QApplication>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<string.h>

using namespace cv;
using namespace std;

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


	//load pics 说明vs + qt + opencv 配置成功

	string imgPath = "E:\\Com\\vs+qt+opencv\\wjd\\test.jpg";
	Mat srcImg = imread(imgPath);//RGB,JPG,PNG,TIFF格式

	if (srcImg.empty()) {
		cout << "can't load pic" << endl;
		exit(-1);
	}
	//show pics
	std::string winName = "cat";//std:: 标准命名空间
	namedWindow(winName, WINDOW_AUTOSIZE);

	imshow(winName, srcImg);

	waitKey(0);//wait function

	return a.exec();

}

程序打包

opencv  Qt vs2019 

debug 转 release 会报错,找不到库函数因此要在release模式重新配置

 在release 文件下找到exe

 

报错

找到msvcp140d.dll 的地址 添加至环境变量,没有这个变量就自己建一个

 在重新操作一遍

windeployqt exe的名字

有warning ,但是还是可以用。。。

 

 

以后遇到问题在更新此部分

 Hello World

#include "wjd.h"
#include <QtWidgets/QApplication>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<string.h>
#include <QDebug>
#include <QLabel>


using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//wjd w;
	//w.show();
	qDebug()<< "the first Qt application" << endl;
	QLabel* label = new QLabel("Hello Qt!");
	label->setGeometry(400, 100, 100, 20);
	label->show();




	return a.exec();

}

槽函数

 信号和槽用于对象间的通讯,信号/槽机制是Qt的一个核心特征。在图形用户界面编程中,我们经常通过信号槽将一个窗口部件的一个变化通知给另一个窗口部件。

1. 信号

当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。

2. 槽

用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。

3. 信号与槽的连接

所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。

4. 特点

一个信号可以连接多个槽,当信号发射时,会以不确定的顺序一个接一个的调用各个槽。多个信号可以连接同一个槽,即无论是哪一个信号被发射,都会调用这个槽。信号直接可以相互连接,发射第一个信号时,也可以发射第二个信号。

实验1,pushbutton 手动连接槽函数

没有用creator 所以没有自动连接槽函数的功能

头文件

public slots: //槽函数声明标志
	void pushButton_clicked(); //声明槽函数

cpp 文件 

#include "wjd.h"
#include <QMessageBox>
#include<QpushButton>

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

	//添加信号槽关联代码,必须放在 setupUi 函数之后。
	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(pushButton_clicked()));

	
}


void wjd::pushButton_clicked()
{
	QMessageBox::information(NULL, "试验1", "王佳东sb");
}

Qlabel 显示opencv 图片

#pragma once

#include <QtWidgets/QWidget>
#include "ui_wjd.h"
#include<opencv2/opencv.hpp>
#include <QLabel>



class wjd : public QWidget
{
	Q_OBJECT

public:
	wjd(QWidget *parent = Q_NULLPTR);

public slots: //槽函数声明标志
	void pushButton_clicked(); //声明槽函数



private:
	Ui::wjdClass ui;
};
#include "wjd.h"
#include <QMessageBox>
#include<QpushButton>

using namespace cv;
using namespace std;


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

	//添加信号槽关联代码,必须放在 setupUi 函数之后。
	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(pushButton_clicked()));

	
}

String path = "E:\\Com\\vs+qt+opencv\\wjd\\test.jpg";

void wjd::pushButton_clicked()
{
	Mat img = imread(path);
	Mat temp;
	cvtColor(img, temp, cv::COLOR_RGB2BGR);//BGR convert to RGB, 因为opencv 的通道

	QImage Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888); Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
	Qtemp = Qtemp.scaled(ui.label->size());// 图片使用label尺寸
	ui.label->setPixmap(QPixmap::fromImage(Qtemp));
	
	//ui.label->resize(Qtemp.size());  // label 适应 image 尺寸
	ui.label->show();


}

实例1 字体修改

复制操作

复制空间,直接ctrl 加鼠标即可复制

QCheckBox,可以重复选择,效果叠加

 每当复选框被选中或清除时,它就会发出信号stateChanged()。如果您希望每次复选框改变状态时触发操作,则连接到此信号。您可以使用isChecked()来查询复选框是否被选中。

QRationButton,只能单选

每当按钮被打开或关闭时,它就会发出clicked()信号。如果您希望每次按钮改变状态时触发一个动作,则连接到此信号。使用isChecked()查看特定的按钮是否被选中。(官方文档是 toggled() 信号.)

 代码

.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_wjd.h"
#include<opencv2/opencv.hpp>




class wjd : public QWidget
{
	Q_OBJECT

public:
	wjd(QWidget *parent = Q_NULLPTR);

public slots: //槽函数声明标志
	void ensure_clicked(); //声明槽函数
	void underline();
	void Italic();
	void Bold();
	void Set_red();
	void Set_black();
private:
	Ui::wjdClass ui;
};

cpp

#include "wjd.h"
#include <QMessageBox>
#include<QpushButton>
#include <QPalette>
#include <QFont>
#include <QLabel>

using namespace cv;
using namespace std;


wjd::wjd(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	//添加信号槽关联代码,必须放在 setupUi 函数之后。
	connect(ui.ensure, SIGNAL(clicked()), this, SLOT(ensure_clicked()));
	//字体
	connect(ui.underline, SIGNAL(stateChanged(int)), this, SLOT(underline()));
	connect(ui.Italic, SIGNAL(stateChanged(int)), this, SLOT(Italic()));
	connect(ui.Bold, SIGNAL(stateChanged(int)), this, SLOT(Bold()));
	//颜色
	connect(ui.red, SIGNAL(clicked()), this, SLOT(Set_red()));
	connect(ui.black, SIGNAL(clicked()), this, SLOT(Set_black()));
}


void wjd::ensure_clicked()// 测试以下槽函数有没有问题
{
	QMessageBox::information(NULL, "试验1", "王佳东sb");
}

void wjd::underline()
{
	QFont font = ui.textShow->font(); // 获取文本框(textShow的字符)
	
	if (ui.underline->isChecked()) {
		//qDebug("yes,underline");
		//为字加下划线
		font.setUnderline(true);
		ui.textShow->setFont(font);
	}
	else{//取消下划线
		font.setUnderline(false);
		ui.textShow->setFont(font);
	}
}

void wjd::Italic()
{
	QFont font = ui.textShow->font(); // 获取文本框(textShow的字符)

	if (ui.Italic->isChecked()) {
		//改字体
		font.setItalic(true);
		ui.textShow->setFont(font);
	}
	else {//取消
		font.setItalic(false);
		ui.textShow->setFont(font);
	}



}

void wjd::Bold()
{
	QFont font = ui.textShow->font(); // 获取文本框(textShow的字符)

	if (ui.Bold->isChecked()) {
		//改字体
		font.setBold(true);
		ui.textShow->setFont(font);
	}
	else {//取消
		font.setBold(false);
		ui.textShow->setFont(font);
	}
}

void wjd::Set_red()
{
	QPalette plet = ui.textShow->palette();      //The QPalette class contains color groups for each widget state
	if (ui.red->isChecked()) {
		plet.setColor(QPalette::Text, Qt::red);
		ui.textShow->setPalette(plet);
	}
	
}

void wjd::Set_black()
{
	QPalette plet = ui.textShow->palette();      //The QPalette class contains color groups for each widget state
	if (ui.black->isChecked()) {
		plet.setColor(QPalette::Text, Qt::black);
		ui.textShow->setPalette(plet);
	}


}

实例2 File APP

记住Qt软件开发时保存路径不能有中文不然会出问题

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_imgProcess.h"
#include <QLabel>
#include <QSpinBox>
#include <QFontComboBox>
#include <QString>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QDir>
#include <QFile>
#include <QDebug>


class imgProcess : public QMainWindow
{
    Q_OBJECT

private:
    QSpinBox* spinFontSzie;
    QFontComboBox* comboFont;

    void initUI();

public:
    imgProcess(QWidget *parent = Q_NULLPTR);

public slots:
    void openFile();
    void saveFile();
    void fontSize();
    void fontType();

private:
    Ui::imgProcessClass ui;
};
#include "imgProcess.h"
#include<iostream>
using namespace std;

void imgProcess::initUI()
{
    spinFontSzie = new QSpinBox;
    spinFontSzie->setMinimum(10);
    spinFontSzie->setMaximum(50);
    ui.mainToolBar->addWidget(new QLabel("size"));
    ui.mainToolBar->addWidget(spinFontSzie);
    //字体大小设置栏

    comboFont = new QFontComboBox;
    ui.mainToolBar->addWidget(new QLabel("type"));
    ui.mainToolBar->addWidget(comboFont);
    //字样的设置栏


}

imgProcess::imgProcess(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    initUI();
    setCentralWidget(ui.textEdit);

    connect(ui.actionopen, SIGNAL(triggered()), this, SLOT(openFile()));
    connect(ui.actionsave, SIGNAL(triggered()), this, SLOT(saveFile()));
    connect(spinFontSzie, SIGNAL(valueChanged(int)), this, SLOT(fontSize()));
    connect(comboFont, SIGNAL(currentFontChanged(QFont)), this, SLOT(fontType()));
}
 
void imgProcess::fontType()//字体类型的设置
{
    QFont font = ui.textEdit->font(); // 获取文本框的内容
    font = comboFont->currentFont();
    font.setPointSize(spinFontSzie->value());
    ui.textEdit->setFont(font);


}

void imgProcess::fontSize()
{
    QFont font = ui.textEdit->font(); // 获取文本框的内容
    font.setPointSize(spinFontSzie->value());
    ui.textEdit->setFont(font);


}


void imgProcess::openFile()// 打开一个文件
{
    ui.textEdit->clear();//先清除已有的文本
    //获取文件名称
    QString fileName = QFileDialog::getOpenFileName(this, "OpenFile", QDir::currentPath());
    if (fileName.isEmpty())
    {
        QMessageBox::information(this, "Error", "Please select a txt");
        return;
    }
    else
    {
        QFile* file = new QFile;
        file->setFileName(fileName);//新建一个文件对象,并且把它设置为上面获取的文件
        bool ok = file->open(QIODevice::ReadOnly);//设置打开模式

        if (ok)//如果可以打开
        {
            //将文件与文本流相关联
            QTextStream in(file);
            ui.textEdit->setText(in.readAll());//读取该文件的所有内容
            file->close();//关闭文件
            delete file;//释放文件进程
        }
        else
        {
            QMessageBox::information(this, "Error Box", "FileOpen Error" + file->errorString());
        }

    }

}

void imgProcess::saveFile()//保存文件
{
    QString filename = QFileDialog::getSaveFileName(this, "Save File", "D:\\");//获取需要保存成的文件名.预设是D盘
    if (filename.isEmpty())
    {
        QMessageBox::information(this, "ErrorBox", "Please input the filename");
        return;
    }
    else
    {
        QFile* file = new QFile;
        file->setFileName(filename);
        bool ok = file->open(QIODevice::WriteOnly);

        if (ok){
                QTextStream out(file);
                out << ui.textEdit->toPlainText(); //转化成纯文本
                file->close();
                delete(file);
         }
        else{
            QMessageBox::information(this, "ErrorBox", "file fail to save");
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值