qt学习
QT學習
QT是一個跨平臺的C++圖形用戶界面應用程序框架。提供建立藝術級圖形界面所需的所有功能。完全面向對象的,很容易擴展,并且允許真正的組件編程。
1.創建第一個QT程序
QWidget功能最簡單
main.cpp
#include "mywidget.h"
#include <QApplication>//包含一個應用程序類的頭文件
//main函數入口 argc命令行變量的數量 argv命令行變量的數組
int main(int argc, char *argv[])
{
//a應用程序對象,在QT中,應用程序對象,有且僅有一個
QApplication a(argc, argv);
//w窗口對象 myWidget父類->QWidget
myWidget w;
//窗口對象 默認不會顯示 必須要調用show方法顯示窗口
w.show();
//讓應用程序對象進入消息循環
//讓代碼阻塞到這行
return a.exec();
}
.pro文件
#-------------------------------------------------
#
# Project created by QtCreator 2021-02-06T11:16:00
#
#-------------------------------------------------
QT += core gui //QT包含的模塊
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上 包含widget模塊
TARGET = 01_project //目標 生成的.exe名稱
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
CONFIG += c++11
SOURCES += //源文件
main.cpp
mywidget.cpp
HEADERS += //頭文件
mywidget.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>//包含頭文件 QWidget窗口類
class myWidget : public QWidget
{
Q_OBJECT //宏 允許類中使用信號和槽的機制
public:
myWidget(QWidget *parent = 0);//構造函數
~myWidget();//析構函數
};
#endif // MYWIDGET_H
2.QPushButton創建
第一個按鈕
首先添加一個頭文件
new一個按鈕,并讓按鈕顯示在widget上
可得到如下一個按鈕
添加文本
第二個按鈕
第二種方式創建按鈕
按照控件的大小創建窗口
第二個創建的會將第一個覆蓋,所以要移動
固定窗口大小以及修改窗口名字
3.對象樹
當創建的對象在堆區域的時候,如果指定的父親是QObject派生下來的類或者QObject的子類派生下來的類,可以不用管理釋放的操作,將對象會放入到對象樹中。一定程度上簡化了內存回收機制。
驗證類的釋放操作
新建一個文件
更改成QPushButton為父類:
cpp文件
#include "mypushbutton.h"
#include <QDebug>
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"我的按鈕類構造調用";
}
MyPushButton::~MyPushButton()
{
qDebug()<<"我的按鈕類析構";
}
h文件
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QPushButton>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = nullptr);
~MyPushButton();
signals:
public slots:
};
#endif // MYPUSHBUTTON_H
可以看出析構函數可以在關閉窗口時被自動執行
4.QT中的坐標系
以左上角為原點(0,0),X向右增加,Y向下增加。
對于嵌套窗口,其坐標是相對于父窗口而言的。
5.信號和槽
提出需求:點擊“我自己的按鈕”,關閉窗口
connect(myBtn,&QPushButton::clicked,this,&myWidget::close);
參數1 信號的發送者
參數2 發送的信號(函數的地址)
參數3 信號的接收者
參數4 處理的槽函數(函數的地址)
5.自定義的信號和槽
需求:
設置一個Teacher 老師類 Student 學生類
下課后,老師會觸發一個餓了信號,學生響應信號,請客吃飯
添加兩個文件
teacher.h
signals:
//自定義信號 寫到signals下
//返回值是void,只需要聲明,不需要實現
//可以有參數,可以重載
void hungry();
student.h
public slots:
//返回值void,需要聲明,也需要實現
//可以有參數,可以發生重載
void treat();
student.cpp
void Student::treat()
{
qDebug()<<"吃飯";
}
widget.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//創建一個老師對象
this->zt=new Teacher(this);
//創建一個學生對象
this->st=new Student(this);
//連接
connect(zt,&Teacher::hungry,st,&Student::treat);
classisover();
}
void Widget::classisover()
{
emit zt->hungry();
}
總結
- 上一篇: 什么是Jsp
- 下一篇: 端午节好玩的亲子项目?