文章首發在部落客知乎
1.程式介紹
1.1 .pro檔案
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-04T13:51:48
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Q2//可修改主菜單名字
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
複制
1.2 main.cpp
int main(int argc, char *argv[])
{
//only one,應用程式對象,有且僅僅有一個
QApplication a(argc, argv);
//視窗對象,預設不會顯示
MainWindow w;
//顯示視窗,預設單獨彈出
w.show();
//應用程式進入消息阻塞
return a.exec();
}
複制
2.快捷方式
-
注釋:ctrl + /
-
運作:ctrl + r
-
編譯:ctrl + b
-
字型縮放:ctrl + 滑鼠滾輪
-
查找:ctrl + f
-
整體移動:ctrl + shift +方向鍵
-
自動對齊:ctrl +i
-
幫助文檔:F1
-
同名之間的 .h 和 .cpp之間切換 F4
3.子產品介紹
3.1 QPushButton
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//建立一個按鈕
QPushButton *btn=new QPushButton();
//依附在主主菜單上
btn->setParent(this);
//按鈕标題
btn->setText("one");
//按鈕坐标
btn->move(0,0);
//第二個按鈕
QPushButton *btn2=new QPushButton("two",this);
//按鈕大小
btn2->resize(200,200);
btn2->move(100,100);
//主菜單大小,可以拖拽
resize(600,400);
//固定主菜單大小
setFixedSize(400,400);
// ui->setupUi(this);
//主菜單标題
setWindowTitle("lyy");
}
複制
結果顯示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwIjNx8CX39CXy8CXycXZpZVZnFWbp9zZlBnauMGM5QTZ3ITO1YmNyETN3EmNyEGO1UDOxIWZycTOyITOvw1M4UTMzgTOtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
3.2 對象樹
從上到下建構,從下到上析構
自建一個類,此類自己標明父親類,同時生成.h和.cpp檔案,包括 .pro中也自動生成,不用手動添加。
生成的.h
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
//自動生成的父類,現在要改成我的父類
#include <QWidget>//改
#include <QPushButton>
class myPushButton : public QPushButton
{
Q_OBJECT
public:
//形參不用改動
explicit myPushButton(QWidget *parent = nullptr);
//添加代碼
~myPushButton();
signals:
public slots:
};
#endif // MYPUSHBUTTON_H
複制
生成的.cpp
#include "mypushbutton.h"#include <QDebug>//列印頭檔案
myPushButton::myPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"gou zao";
}
myPushButton::~myPushButton()
{
qDebug()<<"xi gou";
}
複制
在mainwindow.cpp中添加:
//增加自己的button
myPushButton *mybt=new myPushButton;
mybt->setText("my button");
mybt->move(200,0);
//設定到對象樹中
mybt->setParent(this);
複制
3.3 坐标系
左上角為原點,右為X,下為Y正方向
3.4 信号與槽
需求:實作點選button,菜單關閉的功能。
在mainwindow.cpp中添加
connect(信号的發送者,發送的信号,信号的接收者,處理的槽函數)
connect(mybt,&myPushButton::clicked,this,&QWidget::close);
複制
3.4.1 自定義信号和槽
需求:老師類,學生類,下課後,老師餓了,學生請吃飯
自定義信号:
- 寫在Signals下
- 傳回值是void ,隻需要聲明,不需要實作
- 可以有參數,可以重載
在teahcer.h中:
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定義信号
void hungry();
public slots:
};
#endif // TEACHER_H
複制
在student.h中:
自定義槽函數:
- 早期版本,必須寫在public slots: 下,現在可以直接寫在public下或者全局函數下
- 傳回值void,需要聲明,也需要實作
- 可以有參數,可以發生重載
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
//自定義 信号槽
void treat();
};
#endif // STUDENT_H
複制
widget.cpp 建立對象,進行連結
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//對象建立
this->zt=new Teacher();
this->st=new Student();
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
//自定義函數
void Widget::classIsOver()
{
emit zt->hungry();
}
複制
3.4.2 解決重載信号槽
teache.h:
signals:
//自定義信号
void hungry();
void hungry(QString foodName);
複制
student.h:
public slots:
//自定義 信号槽
void treat();
void treat(QString foodName);
複制
student.cpp:
void Student::treat(QString foodNmae)
{
qDebug<<"請老師吃飯,點菜"<<foodName;
}
複制
實作
{
//對象建立
this->zt=new Teacher();
this->st=new Student();
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
void Widget::classIsOver()
{
emit zt->hungry(“洋芋塊”);
}
複制
報錯:
修改:
//自定義指針
//指針 -> 位址
//函數指針 -> 函數位址
void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
void (Student:: *studentSlot)(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
classIsOver();
複制
what, 怎麼還有引号?
修改student.h
void Student::treat(QString foodNmae)
{
qDebug<<"請老師吃飯,點菜"<<foodName.toUtf8().data();
}
複制
3.4.3 信号與信号的連結
需求:點選一個下課的按鈕,觸發下課。
實作中添加:
繼續上方有參數的函數中實作
QPushButton *but=new QPushButton("xia ke",this);
this-> resize(600,400);
connect(but,&QPushButton::clicked,this,&Widget::classIsOver);
複制
無參數的函數中實作:
信号連結信号
實作函數修改
//無參數
void(Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
void (Student:: *studentSlot2)(void)=&Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
//信号連結信号
connect(but,&QPushButton::clicked,zt,teacherSignal2);
複制
具體過程示範:
斷開信号的連結
disconnect(zt,teacherSignal2,st,studentSlot2);
複制
拓展
- 信号可以與信号連結
- 一個信号可以連結多個槽函數
- 多個信号可以連結一個槽函數
- 信号與槽函數的參數類型必須一一對應
- 信号與槽的參數個數是不是要一緻?信号的參數個數要多于槽的個數
筆記如下:
參考:黑馬程式員