日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

發(fā)布時間:2023/12/19 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言勇哥對于C語言,C++早些年有一些接觸,這個系列貼子就記載一下C++應(yīng)用框架的學(xué)習(xí)經(jīng)驗(yàn)。

在寫程序時,UI、基礎(chǔ)類庫、應(yīng)用程序框架對于vc來講,只能依靠MFC和QT了。

勇哥對MFC有很強(qiáng)的抵觸,它長得丑,很多地方反人類,唯一的好處是VC原生自帶的。

所以還是先研究一下QT,再研究MFC吧,否則會帶了很大的挫折感。

另外,采用vc++進(jìn)行.net開發(fā),即托管方式開發(fā),可以使用WPF做界面,在有些公司也是被采用的方案,

這方面勇哥是全盲,也要抓緊研究一下。

所有將要做的這一切,都是想為OpenCV服務(wù)!

加油。。。

第一篇筆記開始研究QT,包含下面的內(nèi)容:

1、創(chuàng)建第一個Qt程序

2、熟悉按鈕控件常用API

3、對象樹的基本概念

4、Qt中的坐標(biāo)系統(tǒng)

5、信號和槽的基本使用以及拓展

6、opencv讀取顯示圖片

QT的模塊,我們后續(xù)先研究點(diǎn)有用的,包括:Qt Widgets, Qt Core, Qt GUI, Qt Network。

下圖是QTv5版的模塊。如果是v5版以下,Qt Widgets是被包含在GUI中的。

先把練習(xí)程序放上來。

它的工程是這樣的:

很簡單,圖片是opencv讀入,并用QT控件顯示的。

幾個按鈕是代碼創(chuàng)建的,重點(diǎn)是熟悉信號槽的用法,它的作用就是用來完成類似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();??//下課了(無參數(shù))

void?classIsOver2(QString?name);??//下課了(有參數(shù))

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下面。

//槽函數(shù)返回void,它需要聲明也需要實(shí)現(xiàn)。

//槽函數(shù)可以有參數(shù),可以發(fā)生重載

void?eat();

void?eat(QString?name);???//有參數(shù)的槽函數(shù)

};

teacher.h#pragma?once

#include?

class?Teacher?:?public?QObject

{

Q_OBJECT

public:

Teacher(QObject?*parent);

~Teacher();

signals:

//信號必須void,可以有參數(shù)。

//信號只需要聲明,不需要實(shí)現(xiàn)。

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"));

//按下后執(zhí)行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);

//按下后直接關(guān)閉當(dāng)前窗口

connect(btn2,?&MyButton::clicked,?this,?&QtForOpencv::close);

setWindowTitle(QStringLiteral("這是父窗口的標(biāo)題"));

setFixedSize(600,?600);

MyButton*?btn3?=?new?MyButton(this);

btn3->setText(QStringLiteral("自定義按鈕"));

btn3->move(100,?200);

//信號發(fā)送者,發(fā)送的信號,信號的接收者,處理的槽函數(shù)

//按下后輸出一句話在調(diào)試窗口

connect(btn3,?&MyButton::clicked,?this,?&QtForOpencv::clickfun);

//自動定義信號和槽函數(shù)

//兩個類?Teacher,Student類

//下課后,?老師tc發(fā)一個信號??“餓了”

//學(xué)生st響應(yīng)這個信號,處理槽函數(shù)??“請客吃飯?”

tc?=?new?Teacher(this);

st?=?new?Student(this);

//下面是信號與槽函數(shù)沒有參數(shù)沒有重載情況下的寫法

//connect(tc,?&Teacher::hugry,?st,?&Student::eat);

//classIsOver();

//下面是信號與槽函數(shù)都有重載的情況下的寫法

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()

{

//觸發(fā)老師餓了的信號

//這個信號是自定義信號,觸發(fā)自定義的信號關(guān)鍵字是emit

emit?tc->hugry();

}

void?QtForOpencv::classIsOver2(QString?name)

{

//觸發(fā)老師餓了的信號

//這個信號是自定義信號,觸發(fā)自定義的信號關(guān)鍵字是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)

{

//注意下面兩句的區(qū)別

//直接引號的字符串是char*,?第二句是把QString轉(zhuǎn)為char*

//qDebug()?<

qDebug()?<

}

teacher.cpp#include?"teacher.h"

Teacher::Teacher(QObject?*parent)

:?QObject(parent)

{

}

Teacher::~Teacher()

{

}

代碼里的一些知識點(diǎn):

Main函數(shù)

QApplication a? 應(yīng)用程序?qū)ο? 有且僅有一個

a.exec() 進(jìn)行消息循環(huán)? 阻塞

MyWidget w? 窗口對象

默認(rèn)不會彈出窗口 想要顯示窗口 需要調(diào)用 show

QPushButton

QPushButton * btn? = new QPushButton;

btn->setParent(this) 設(shè)置父親

btn->setText (“aaa”)

btn->move( x, y)

重置窗口大小? resize(w,h)

重置窗口標(biāo)題? setWindowTitle(“aaaa”)

設(shè)置固定窗口大小? setFixedSize(w,h)

對象樹

所有new出來的對象 不用管釋放

原因 children表中的對象會在窗口關(guān)閉后進(jìn)行自動釋放

Qt中的坐標(biāo)系

x正向 →

y正向 ↓

Qt中的信號和槽

需求 點(diǎn)擊按鈕 關(guān)閉窗口

connect(? 信號發(fā)送者,發(fā)送的信號,信號接受者,處理槽函數(shù) )

優(yōu)點(diǎn)? 松散耦合

Qt中的自定義信號和槽

自定義信號

返回值 void

需要聲明 不需要實(shí)現(xiàn)

可以有參數(shù)

自定義槽函數(shù)

返回值void

需要聲明 需要實(shí)現(xiàn)

可以有參數(shù)

觸發(fā)自定義的信號

emit

當(dāng)自定義信號和槽 出現(xiàn)重載時候,原先寫法失效,因?yàn)閳?zhí)行的函數(shù)地址不明確

解決方法: 利用函數(shù)指針 來明確指向哪個函數(shù)的地址

QString轉(zhuǎn)char*? ? toUtf8 轉(zhuǎn) QBtyeArray 類型? 在利用data 轉(zhuǎn)成char*

信號和槽的拓展

信號是可以連接信號的

信號和槽可以斷開? disconnect

一個信號可以連接多個槽函數(shù)

多個信號可以連接同一個槽函數(shù)

信號和槽函數(shù)的個數(shù)必須一一對應(yīng)

信號的參數(shù)個數(shù) 可以大于槽函數(shù)的參數(shù)個數(shù) ,反之不可以

#轉(zhuǎn)載請注明出處 www.skcircle.com 《少有人走的路》勇哥的工業(yè)自動化技術(shù)網(wǎng)站。如果需要本貼圖片源碼等資源,請向勇哥索取。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。