柚子快報(bào)激活碼778899分享:QT5學(xué)習(xí)筆記/順帶學(xué)C++
柚子快報(bào)激活碼778899分享:QT5學(xué)習(xí)筆記/順帶學(xué)C++
本文的標(biāo)題順序排布不局有普遍性,純粹是我個(gè)人學(xué)習(xí)過程中學(xué)到哪記到哪,可能會(huì)非常跳脫
1.概念解釋
Qt使用C++語法開發(fā),語法上有著C++的特性,或者說Qt是C++的一個(gè)大型拓展庫;但不意味著QT是一種語言,還存在PyQt:使用python開發(fā)的QtQt面向?qū)ο蟮奶匦允怯捎贑++的面向?qū)ο筇匦?/p>
面向?qū)ο缶幊蹋阂环N編程范式,與之對(duì)應(yīng)“面向過程編程”
面向?qū)ο缶幊虒⒊绦虺橄鬄閹讉€(gè)部分包括“對(duì)象”“類”“封裝”等等;
面向?qū)ο笈c面向過程的區(qū)別如下:
對(duì)于炒蛋炒飯,面向過程這樣寫:
1,先炒蛋
2,再炒飯
3,倒在一起炒
4,出鍋
而面向?qū)ο筮@樣寫:
1,抽象出蛋、米飯、人、鍋這幾個(gè)對(duì)象
2,安排蛋這個(gè)對(duì)象其行為需要被炒
3,安排米飯這個(gè)對(duì)象其行為需要被炒
4,安排人這個(gè)對(duì)象其行為需要主動(dòng)去炒
5,安排鍋這個(gè)對(duì)象其行為需要加熱
6,安排被炒后的蛋和米飯需要混在一起再被炒
7,以上6步一起執(zhí)行然后得出蛋炒飯這個(gè)結(jié)果
現(xiàn)實(shí)中炒飯需要考慮先后順序,這里僅舉例說明兩種范式的區(qū)別
QtCreator是方便開發(fā)者開發(fā)Qt的圖形化開發(fā)環(huán)境,本質(zhì)是一個(gè)工業(yè)軟件,除了QtCreator,使用命令行控制臺(tái)也可以直接開發(fā)Qt,只是不方便
2.Qt的編譯/例程
控制臺(tái)編譯Qt的過程:
編寫源代碼 設(shè)置環(huán)境變量:注意需要將使用的編譯器(mingw32)放置在環(huán)境變量列表的最上方, 否則寫完qt后運(yùn)行會(huì)提示無法定位程序輸入點(diǎn)于動(dòng)態(tài)鏈接庫 生成工程文件: 控制臺(tái)輸入?qmake -project , 修改工程文件的最后一行添加?QT += Widget? gui,否則編譯時(shí)會(huì)報(bào)錯(cuò) 生成makefile: 控制臺(tái)輸入?qmake 編譯: 控制臺(tái)輸入?mingw32-make
最基本編譯主函數(shù)結(jié)構(gòu):
#include
int main(int argc,char *argv[])//argv屬于指針數(shù)組變量,不要忘記[]
{
QApplication app(argc,argv);//固定格式
return app.exec();//主窗口需要永遠(yuǎn)存在,所以exec=程序永遠(yuǎn)執(zhí)行(死循環(huán)
}
Qt最大的作用在于創(chuàng)建圖形化的界面,對(duì)于一個(gè)圖形界面,其文本描述、用戶輸入框、列表、展示的圖片、交互按鈕等,都被稱之為控件
控件有標(biāo)簽、行編輯框、文本編輯框等,都屬于對(duì)象,以windows的運(yùn)行界面為例程,將其復(fù)現(xiàn)
圖中紅框部分均為不同控件對(duì)象,控件與控件之間的排布稱為布局
使用Qt復(fù)現(xiàn)windows的運(yùn)行窗口
#include
#include
#include
#include
//主程序中使用到了Qt定義的控件類型,故在頭文件中需要事先加入對(duì)應(yīng)的include
#include
#include
#include
int main(int argc,char *argv[])
{
QApplication app(argc,argv);//固定格式
QLabel *infoLabel = new QLabel;//生成一個(gè)新的對(duì)象并被包含在某類中
QLabel *openLabel = new QLabel;
//new申請(qǐng)對(duì)象后返回的是地址,需要用指針去接收地址,所以定義新對(duì)象時(shí)均使用了指針
QLineEdit *cmdLine = new QLineEdit;//行編輯控件,用于用戶輸入行文本
QPushButton *commmitButton = new QPushButton;
QPushButton *cancelButton = new QPushButton;
QPushButton *browseButton = new QPushButton;
infoLabel->setText("input cmd:");//對(duì)上一步創(chuàng)建好的對(duì)象編寫該對(duì)象的行為例如設(shè)置文本
openLabel->setText("OPEN");
commmitButton->setText("commit");
cancelButton->setText("cansel");
browseButton->setText("browse");
//以上調(diào)用的函數(shù)(如setText)均為無參構(gòu)造,故沒有()
QHBoxLayout *cmdLayout = new QHBoxLayout;//創(chuàng)建布局對(duì)象以修改不同控件間的位置
cmdLayout->addWidget(openLabel);
cmdLayout->addWidget(cmdLine);//在剛剛創(chuàng)建的布局對(duì)象中添加需要調(diào)整位置的兩個(gè)控件對(duì)象
QHBoxLayout *ButtonLayout = new QHBoxLayout;
ButtonLayout->addWidget(commmitButton);
ButtonLayout->addWidget(cancelButton);
ButtonLayout->addWidget(browseButton);//按鈕部分也需要水平布局
QVBoxLayout *mainLayout = new QVBoxLayout;//創(chuàng)建垂直布局對(duì)象
mainLayout->addWidget(infoLabel);
mainLayout->addLayout(cmdLayout);//在布局中添加布局,用的函數(shù)略有不同
mainLayout->addLayout(ButtonLayout);
QWidget w;//創(chuàng)建窗口,因?yàn)椴簧婕皡?shù)更改,故不用使用指針
w.setLayout(mainLayout);//設(shè)置主窗口的行為,類似上面的->
w.show();//設(shè)置完主窗口的總體布局還需要讓窗口展示出來
w.setWindowTitle("運(yùn)行");//主題窗口的標(biāo)題
return app.exec();//主窗口需要永遠(yuǎn)存在,所以exec=程序永遠(yuǎn)執(zhí)行(死循環(huán)
}
編寫完后,進(jìn)行控制臺(tái)編譯,以minGw 7.3為例運(yùn)行
控制臺(tái)編譯Qt僅用作了解編譯過程學(xué)習(xí),正常開發(fā)中不會(huì)使用這種方法,效率極低。
3.QtCreator/信號(hào)與槽
3.1QtCreator
創(chuàng)建工程的類選擇中 Qmainwindow 與Qwidget有所區(qū)分,
一般的小窗口屬于Qwidget類,如微信登陸窗口;
帶有菜單的完整界面窗口為Qmainwindow類,如各微信主界面;Qdialog類是一般的對(duì)話框。
QtCreator將Qt程序開發(fā)分為兩類,一類邏輯代碼,一類界面設(shè)計(jì)
在邏輯代碼在“編輯”中開發(fā),編寫軟件項(xiàng)目后臺(tái)的邏輯操作;
界面設(shè)計(jì)在“設(shè)計(jì)”中開發(fā),是純圖形化的設(shè)計(jì)界面,保存為.ui后綴文件,在這個(gè)欄目的操作僅為設(shè)計(jì)定制將要開發(fā)的軟件交互界面,如按鈕擺放位置,窗口大小形狀等,按鈕按下的后續(xù)邏輯響應(yīng)需要用到信號(hào)與槽機(jī)制。
3.2信號(hào)與槽?
對(duì)按鈕或其他動(dòng)作觸發(fā)的響應(yīng)稱為信號(hào),信號(hào)需要傳遞給槽函數(shù)執(zhí)行,槽函數(shù)就是其響應(yīng)結(jié)果
可以在設(shè)計(jì)圖形化界面中右鍵直接創(chuàng)建槽接口,QtCreator會(huì)自動(dòng)補(bǔ)全需要的語法語句,手動(dòng)編寫時(shí),槽函數(shù)在主程序文件中編寫完后,還需要在頭文件中進(jìn)行聲明?,例如“取消按鈕”按下后會(huì)觸發(fā)一個(gè)信號(hào),處理該信號(hào)的槽函數(shù)為:
void Widget::on_cancelButton_clicked()
{
this->close();
}
其作用是關(guān)閉這個(gè)父類?;除此之外還需要在頭文件中聲明
private slots:
void on_cancelButton_clicked();
槽函數(shù)的作用就是觸發(fā)響應(yīng)信號(hào)后執(zhí)行的結(jié)果,有了結(jié)果還需要和對(duì)應(yīng)的信號(hào)連接起來,由此引出非常重要的函數(shù)connect
connect定義為:
connect(誰發(fā)出信號(hào),發(fā)出的信號(hào),誰接收信號(hào),接收后怎么處理);
?在上述例子中對(duì)應(yīng)的connect函數(shù)語句為
connect(ui->cancelButton,&QPushButton::clicked,this,&Widget::on_cancelButton_clicked);
此為connect的一種寫法,取類地址后添加動(dòng)作函數(shù) ,還有一種connect寫法:
connect(ui->cmdLine,SIGNAL(returnPressed()),this,SLOT(on_commitButton_clicked()));
/*ui指針指向的成員cmdline發(fā)出信號(hào),
cmdline屬于QlineEdit該類中對(duì)回車鍵的信號(hào)描述為上文所示,
交給父類進(jìn)行處理,然后將信號(hào)連接到對(duì)應(yīng)槽函數(shù)*/
?其作用為將輸入行觸發(fā)的回車鍵按下的信號(hào)連接到commitButton這個(gè)按鈕上
而commitButton按鈕對(duì)應(yīng)的槽函數(shù)為
void Widget::on_commitButton_clicked()
{
QString program = ui->cmdLine->text();
QProcess *myProcess = new QProcess(this);//創(chuàng)建process對(duì)象
myProcess->start(program);
}
Line3是說,QString這個(gè)類中的Program這個(gè)自定函數(shù)對(duì)象的值來自于ui指針指向的成員cmdLine的text函數(shù)的值,text函數(shù)的作用是接收用戶輸入的數(shù)據(jù)(字符串)按鍵按下后會(huì)接入到QProcees函數(shù)里,QProcess會(huì)調(diào)用windows同名進(jìn)程,故commitButton按鍵的作用就是接收用戶輸入的字符串,然后打開windows中相應(yīng)的進(jìn)程,若用戶輸入的字符不是windows的進(jìn)程之一則無響應(yīng)。
另外設(shè)置按鈕對(duì)應(yīng)觸發(fā)進(jìn)程前,頭文件需要添加 #include
4.部分C++語法
4.1類與結(jié)構(gòu)體
如果要定義的一種包含多子類的數(shù)據(jù),他各個(gè)子數(shù)據(jù)包含各自的行為屬性(成員函數(shù)),就要使用class定義
class Box
{
public:
double length; // 長(zhǎng)度
double breadth; // 寬度
double height; // 高度
// 成員函數(shù)聲明
double volume(void);
void set( double len, double bre, double hei );
};
// 成員函數(shù)定義
double Box::volume(void)
{
return length * breadth * height;
}
void Box::set( double len, double bre, double hei)
{
length = len;
breadth = bre;
height = hei;
}
如果要定義的一種包含多子類的數(shù)據(jù),他各個(gè)子類僅有數(shù)據(jù),沒有行為屬性,就沒必要使用class,struct結(jié)構(gòu)體即可
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
在C++中,類class 和 結(jié)構(gòu)體struct 均可以定義成員函數(shù)(但是C語言中struct不能指定成員函數(shù),僅有成員數(shù)據(jù)) 其區(qū)別僅在定義的初始訪問變量的優(yōu)先級(jí)不同(作用域不同)
class A
{
int a; //此處的a變量是私有的,僅在A作用域內(nèi)
}
struct B
{
int a; //此處的a變量是公有的,不需要通過public來聲明
}
柚子快報(bào)激活碼778899分享:QT5學(xué)習(xí)筆記/順帶學(xué)C++
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。