目录
初始配置,opencv + VS019 + QT5.14
程序打包
Hello World
槽函数
1. 信号
2. 槽
3. 信号与槽的连接
4. 特点
Qlabel 显示opencv 图片
实例1 字体修改
复制操作
QCheckBox,可以重复选择,效果叠加
QRationButton,只能单选
代码
实例2 File APP
#include "wjd.h"
#include
#include
#include
#include
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模式重新配置
报错
找到msvcp140d.dll 的地址 添加至环境变量,没有这个变量就自己建一个
在重新操作一遍
windeployqt exe的名字
有warning ,但是还是可以用。。。
以后遇到问题在更新此部分
#include "wjd.h"
#include
#include
#include
#include
#include
#include
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的一个核心特征。在图形用户界面编程中,我们经常通过信号槽将一个窗口部件的一个变化通知给另一个窗口部件。
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
一个信号可以连接多个槽,当信号发射时,会以不确定的顺序一个接一个的调用各个槽。多个信号可以连接同一个槽,即无论是哪一个信号被发射,都会调用这个槽。信号直接可以相互连接,发射第一个信号时,也可以发射第二个信号。
实验1,pushbutton 手动连接槽函数
没有用creator 所以没有自动连接槽函数的功能
头文件
public slots: //槽函数声明标志
void pushButton_clicked(); //声明槽函数
cpp 文件
#include "wjd.h"
#include
#include
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");
}
#pragma once
#include
#include "ui_wjd.h"
#include
#include
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
#include
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();
}
复制空间,直接ctrl 加鼠标即可复制
每当复选框被选中或清除时,它就会发出信号stateChanged()。如果您希望每次复选框改变状态时触发操作,则连接到此信号。您可以使用isChecked()来查询复选框是否被选中。
每当按钮被打开或关闭时,它就会发出clicked()信号。如果您希望每次按钮改变状态时触发一个动作,则连接到此信号。使用isChecked()查看特定的按钮是否被选中。(官方文档是 toggled() 信号.)
.h
#pragma once
#include
#include "ui_wjd.h"
#include
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
#include
#include
#include
#include
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);
}
}
记住Qt软件开发时保存路径不能有中文不然会出问题
#pragma once
#include
#include "ui_imgProcess.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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
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");
}
}
}