qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...
前言勇哥對于C語言,C++早些年有一些接觸,這個系列貼子就記載一下C++應用框架的學習經驗。
在寫程序時,UI、基礎類庫、應用程序框架對于vc來講,只能依靠MFC和QT了。
勇哥對MFC有很強的抵觸,它長得丑,很多地方反人類,唯一的好處是VC原生自帶的。
所以還是先研究一下QT,再研究MFC吧,否則會帶了很大的挫折感。
另外,采用vc++進行.net開發,即托管方式開發,可以使用WPF做界面,在有些公司也是被采用的方案,
這方面勇哥是全盲,也要抓緊研究一下。
所有將要做的這一切,都是想為OpenCV服務!
加油。。。
第一篇筆記開始研究QT,包含下面的內容:
1、創建第一個Qt程序
2、熟悉按鈕控件常用API
3、對象樹的基本概念
4、Qt中的坐標系統
5、信號和槽的基本使用以及拓展
6、opencv讀取顯示圖片
QT的模塊,我們后續先研究點有用的,包括:Qt Widgets, Qt Core, Qt GUI, Qt Network。
下圖是QTv5版的模塊。如果是v5版以下,Qt Widgets是被包含在GUI中的。
先把練習程序放上來。
它的工程是這樣的:
很簡單,圖片是opencv讀入,并用QT控件顯示的。
幾個按鈕是代碼創建的,重點是熟悉信號槽的用法,它的作用就是用來完成類似C#中的按鈕的事件。
先提供源代碼。
MyButton.h#pragma?once
#include?
#include?
class?MyButton?:?public?QPushButton
{
Q_OBJECT
public:
MyButton(QWidget?*parent);
~MyButton();
};
QtForOpencv.h#pragma?once
#pragma?execution_character_set("utf-8")
#include?
#include?"ui_QtForOpencv.h"
#include?
#include?"student.h"
#include?"teacher.h"
class?QtForOpencv?:?public?QWidget
{
Q_OBJECT
public:
QtForOpencv(QWidget?*parent?=?Q_NULLPTR);
~QtForOpencv();
void?clickfun();
void?classIsOver();??//下課了(無參數)
void?classIsOver2(QString?name);??//下課了(有參數)
void?btn1Fun();
private:
Ui::QtForOpencvClass?ui;
public:
QLabel*?imgLabel;
Teacher*?tc;
Student*?st;
};
student.h#pragma?once
#pragma?execution_character_set("utf-8")
#include?
class?Student?:?public?QObject
{
Q_OBJECT
public:
Student(QObject?*parent);
~Student();
public?slots:
//低版本寫在這里,高版本直接寫到public下面。
//槽函數返回void,它需要聲明也需要實現。
//槽函數可以有參數,可以發生重載
void?eat();
void?eat(QString?name);???//有參數的槽函數
};
teacher.h#pragma?once
#include?
class?Teacher?:?public?QObject
{
Q_OBJECT
public:
Teacher(QObject?*parent);
~Teacher();
signals:
//信號必須void,可以有參數。
//信號只需要聲明,不需要實現。
void?hugry();
void?hugry(QString?name);
};
main.cpp#include?"QtForOpencv.h"
#include?
int?main(int?argc,?char?*argv[])
{
QApplication?a(argc,?argv);
QtForOpencv?w;
w.show();
return?a.exec();
}
MyButton.cpp#include?"MyButton.h"
#include?
MyButton::MyButton(QWidget?*parent)
:?QPushButton(parent)
{
}
MyButton::~MyButton()
{
qDebug()?<
}
QtForOpencv.cpp#include?"QtForOpencv.h"
#include?
#include?
#include?
#include?
#include?
#include?"MyButton.h"
#include?
#include?
using?namespace?cv;
using?namespace?std;
QtForOpencv::QtForOpencv(QWidget?*parent)
:?QWidget(parent)
{
ui.setupUi(this);
QPushButton*?btn?=?new?QPushButton();
btn->setParent(this);
btn->setText(QStringLiteral("push按鈕1"));
//按下后執行btn1Fun,彈出一個messagebox
connect(btn,?&QPushButton::clicked,?this,?&QtForOpencv::btn1Fun);
QPushButton*?btn2?=?new?QPushButton(QStringLiteral("push按鈕2"),?this);
resize(600,?400);
btn2->move(100,?100);
btn2->resize(150,?50);
//按下后直接關閉當前窗口
connect(btn2,?&MyButton::clicked,?this,?&QtForOpencv::close);
setWindowTitle(QStringLiteral("這是父窗口的標題"));
setFixedSize(600,?600);
MyButton*?btn3?=?new?MyButton(this);
btn3->setText(QStringLiteral("自定義按鈕"));
btn3->move(100,?200);
//信號發送者,發送的信號,信號的接收者,處理的槽函數
//按下后輸出一句話在調試窗口
connect(btn3,?&MyButton::clicked,?this,?&QtForOpencv::clickfun);
//自動定義信號和槽函數
//兩個類?Teacher,Student類
//下課后,?老師tc發一個信號??“餓了”
//學生st響應這個信號,處理槽函數??“請客吃飯?”
tc?=?new?Teacher(this);
st?=?new?Student(this);
//下面是信號與槽函數沒有參數沒有重載情況下的寫法
//connect(tc,?&Teacher::hugry,?st,?&Student::eat);
//classIsOver();
//下面是信號與槽函數都有重載的情況下的寫法
void(Teacher::?*tSignal)(QString)?=?&Teacher::hugry;
void(Student::?*sSignal)(QString)?=?&Student::eat;
connect(tc,?tSignal,?st,?sSignal);
classIsOver2("東莞燒鴨");
//演示opencv載入圖片并顯示
Mat?src?=?imread("e:/1.jpg");??//?讀取圖片
if?(src.empty())?{
printf("could?not?load?image...\n");
}
cvtColor(src,?src,?COLOR_BGR2RGB);?//BGR圖片裝換成RGB圖片
cv::resize(src,?src,?Size(300,?300));??//?修改圖片大小
imgLabel?=?new?QLabel(this);
imgLabel->setText(QStringLiteral("原圖"));
imgLabel->move(200,?200);
QImage?showImg?=?QImage((const?unsigned?char*)(src.data),?src.rows,?src.cols,?QImage::Format_RGB888);
imgLabel->setPixmap(QPixmap::fromImage(showImg));
imgLabel->show();??//?在qt界面顯示圖片
waitKey(0);
}
void?QtForOpencv::btn1Fun()
{
//演示了QMessageBox的用法
qDebug()?<
QMessageBox::StandardButton?rb?=?QMessageBox::information(NULL,?"Title",?"按鈕一被按下了!",
QMessageBox::Yes?|?QMessageBox::No,?QMessageBox::Yes);
if?(rb?==?QMessageBox::Yes)
{
QMessageBox::aboutQt(NULL,?"About?Qt");
}
}
void?QtForOpencv::clickfun()
{
qDebug()?<
}
QtForOpencv::~QtForOpencv()
{
qDebug()?<
}
void?QtForOpencv::classIsOver()
{
//觸發老師餓了的信號
//這個信號是自定義信號,觸發自定義的信號關鍵字是emit
emit?tc->hugry();
}
void?QtForOpencv::classIsOver2(QString?name)
{
//觸發老師餓了的信號
//這個信號是自定義信號,觸發自定義的信號關鍵字是emit
emit?tc->hugry("東莞燒鴨");
}
student.cpp#include?"student.h"
#include?
Student::Student(QObject?*parent)
:?QObject(parent)
{
}
Student::~Student()
{
}
void?Student::eat()
{
qDebug()?<
}
void?Student::eat(QString?name)
{
//注意下面兩句的區別
//直接引號的字符串是char*,?第二句是把QString轉為char*
//qDebug()?<
qDebug()?<
}
teacher.cpp#include?"teacher.h"
Teacher::Teacher(QObject?*parent)
:?QObject(parent)
{
}
Teacher::~Teacher()
{
}
代碼里的一些知識點:
Main函數
QApplication a? 應用程序對象? 有且僅有一個
a.exec() 進行消息循環? 阻塞
MyWidget w? 窗口對象
默認不會彈出窗口 想要顯示窗口 需要調用 show
QPushButton
QPushButton * btn? = new QPushButton;
btn->setParent(this) 設置父親
btn->setText (“aaa”)
btn->move( x, y)
重置窗口大小? resize(w,h)
重置窗口標題? setWindowTitle(“aaaa”)
設置固定窗口大小? setFixedSize(w,h)
對象樹
所有new出來的對象 不用管釋放
原因 children表中的對象會在窗口關閉后進行自動釋放
Qt中的坐標系
x正向 →
y正向 ↓
Qt中的信號和槽
需求 點擊按鈕 關閉窗口
connect(? 信號發送者,發送的信號,信號接受者,處理槽函數 )
優點? 松散耦合
Qt中的自定義信號和槽
自定義信號
返回值 void
需要聲明 不需要實現
可以有參數
自定義槽函數
返回值void
需要聲明 需要實現
可以有參數
觸發自定義的信號
emit
當自定義信號和槽 出現重載時候,原先寫法失效,因為執行的函數地址不明確
解決方法: 利用函數指針 來明確指向哪個函數的地址
QString轉char*? ? toUtf8 轉 QBtyeArray 類型? 在利用data 轉成char*
信號和槽的拓展
信號是可以連接信號的
信號和槽可以斷開? disconnect
一個信號可以連接多個槽函數
多個信號可以連接同一個槽函數
信號和槽函數的個數必須一一對應
信號的參數個數 可以大于槽函數的參數個數 ,反之不可以
#轉載請注明出處 www.skcircle.com 《少有人走的路》勇哥的工業自動化技術網站。如果需要本貼圖片源碼等資源,請向勇哥索取。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算(cloud computing)
- 下一篇: Python 错误和异常小结[转]