天天看點

Qt入門系列(一)

文章首發在部落客知乎

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.快捷方式

  1. 注釋:ctrl + /

  2. 運作:ctrl + r

  3. 編譯:ctrl + b

  4. 字型縮放:ctrl + 滑鼠滾輪

  5. 查找:ctrl + f

  6. 整體移動:ctrl + shift +方向鍵

  7. 自動對齊:ctrl +i

  8. 幫助文檔:F1

  9. 同名之間的 .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");
}
           

複制

結果顯示:

Qt入門系列(一)

3.2 對象樹

Qt入門系列(一)

從上到下建構,從下到上析構

自建一個類,此類自己標明父親類,同時生成.h和.cpp檔案,包括 .pro中也自動生成,不用手動添加。

Qt入門系列(一)

生成的.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 信号與槽

Qt入門系列(一)

需求:實作點選button,菜單關閉的功能。

在mainwindow.cpp中添加

connect(信号的發送者,發送的信号,信号的接收者,處理的槽函數)

connect(mybt,&myPushButton::clicked,this,&QWidget::close);
           

複制

3.4.1 自定義信号和槽

需求:老師類,學生類,下課後,老師餓了,學生請吃飯

自定義信号:

  1. 寫在Signals下
  2. 傳回值是void ,隻需要聲明,不需要實作
  3. 可以有參數,可以重載

在teahcer.h中:

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定義信号
    void hungry();

public slots:
};

#endif // TEACHER_H

           

複制

在student.h中:

自定義槽函數:

  1. 早期版本,必須寫在public slots: 下,現在可以直接寫在public下或者全局函數下
  2. 傳回值void,需要聲明,也需要實作
  3. 可以有參數,可以發生重載
#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(“洋芋塊”);
 }
           

複制

報錯:

Qt入門系列(一)

修改:

//自定義指針
   //指針 -> 位址
   //函數指針 -> 函數位址
  void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
  void (Student:: *studentSlot)(QString)=&Student::treat;

    connect(zt,teacherSignal,st,studentSlot);
  classIsOver();           

複制

Qt入門系列(一)

what, 怎麼還有引号?

修改student.h

void Student::treat(QString foodNmae)
{
    qDebug<<"請老師吃飯,點菜"<<foodName.toUtf8().data();
}
           

複制

Qt入門系列(一)

3.4.3 信号與信号的連結

需求:點選一個下課的按鈕,觸發下課。

實作中添加:

繼續上方有參數的函數中實作

QPushButton *but=new QPushButton("xia ke",this);
 this-> resize(600,400);
 connect(but,&QPushButton::clicked,this,&Widget::classIsOver);
           

複制

Qt入門系列(一)

無參數的函數中實作:

信号連結信号

實作函數修改

//無參數
    void(Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
    void (Student:: *studentSlot2)(void)=&Student::treat;
     connect(zt,teacherSignal2,st,studentSlot2);
     //信号連結信号
    connect(but,&QPushButton::clicked,zt,teacherSignal2);           

複制

具體過程示範:

Qt入門系列(一)

斷開信号的連結

disconnect(zt,teacherSignal2,st,studentSlot2);
           

複制

Qt入門系列(一)

拓展

  1. 信号可以與信号連結
  2. 一個信号可以連結多個槽函數
  3. 多個信号可以連結一個槽函數
  4. 信号與槽函數的參數類型必須一一對應
  5. 信号與槽的參數個數是不是要一緻?信号的參數個數要多于槽的個數

筆記如下:

Qt入門系列(一)
Qt入門系列(一)
Qt入門系列(一)
Qt入門系列(一)
Qt入門系列(一)

參考:黑馬程式員