QT学习笔记2(应用程序设计基础)

一、UI文件设计与运行机制

1、项目管理文件(.pro)

项目的管理文件以 .pro结尾,打开之后

#-------------------------------------------------
#
# Project created by QtCreator 2018-11-10T15:26:48
#
#-------------------------------------------------

QT       += core gui    //表示项目中加入core gui模块 ,core gui是qt用于GUI设计的类库文件

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //加入widgets模块

TARGET = test1  //生成的目标可执行文件的名称 ,即编译生成的可执行文件是 test1.exe
TEMPLATE = app  //项目使用的模板是app,是一般的应用程序

//以下三个记录了项目中包含的源程序文件、头文件和窗体文件的名称
SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

2、界面文件(.ui)

属性编辑器

信号与槽的简单使用:

实现点击一个按钮后,实现窗口关闭的功能。

编译运行之后即可实现点击按钮,关闭窗口的功能。

3、主函数文件(main.cpp)

main()函数是应用程序的入口。主要功能是创建应用程序,创建窗口,显示窗口,并运行应用程序,开始应用程序的消息循环和事件处理。

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//定义并创建应用程序
    MainWindow w;//定义并创建窗口
    w.show();//显示窗口

    return a.exec();//应用程序运行
}

4、窗体相关文件

我用的qt5.6.1与书上讲的qt5.9略有不同。

(1)mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {  //命名空间ui,包含一个类 MainWindow,用于描述界面组件
class MainWindow;
}

class MainWindow : public QMainWindow  //MainWindow类的定义
{
    Q_OBJECT //宏Q_OBJECT,这里是qt的信号与槽机制的类都必须加入的一个宏

public:  //定义了MainWindow类的构造函数和析构函数
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:   //定义了一个指针,指针ui指向可视化设计的界面,要访问的组件都是通过这个指针ui
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

(2)mainwindow.cpp  文件

mainwindow.cpp文件是类mainwindow的实现代码。

#include "mainwindow.h"
#include "ui_mainwindow.h"//Qt编译生成的与ui文件对应的类定义文件
//构造函数头部   执行父类QWidget的构造函数
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) //创建一个Ui::MainWindow类的对象ui,ui就是MainWindow的部分定义的指针变量ui
{
    ui->setupUi(this);//执行Ui::MainWindow类的setupUi()函数,实现窗口的生成和各种属性的设置、信号与槽的关联
}

MainWindow::~MainWindow()
{
    delete ui;//析构函数,删除用new创建的指针ui
}

(3)mainwindow.ui文件

是一个XML文件,定义了窗口上所有组件的属性设置、布局,及其信号与槽函数的关联等。

二、可视化UI设计

1、工具栏各按钮功能

使用工具栏上的布局控制按钮时,只需要在窗体上选中需要设计布局的组件,然后点击某个布局按钮即可。

2、信号与槽

信号:就是特定情况下被发射的事件,例如PushButton组件的鼠标点击 clicked()信号。GUI程序设计的主要内容就是对各个组件的信号的响应,只需要知道在什么情况下发射哪些信号,合理的响应这些信号。

槽:就是对信号的响应函数。槽函数与一般函数不同,槽函数可以关联信号,当信号发射时,关联的槽函数被自动执行。

信号与槽关联的使用QObject::connect()函数实现的,其基本格式是:

QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

各部分详解:

QObject是所有Qt类的基类;

connect()是QObject类的一个静态函数;

sender是发射信号的对象名称;

signal()是信号名称,有参数还要指明参数;

receiver是接收对象名称;

slot()是槽函数名称,有参数还要指明参数;

SIGNAL和SLOT是qt的宏,用于指明信号和槽,并将它们的参数转化为相应的字符串。

举例:

     QObject::connect(btnClose,SIGNAL(clicked()),Widget,SLOT(close()));

作用就是将btnClose按钮的clicked()信号与窗体Widget的槽函数close()相关关联

信号和槽的使用规则:

 (1)一个信号可以连接多个槽

(2)多个信号可以连接同一个槽

(3)一个信号可以连接另外一个信号

3、可视化生成槽函数

选择一个框架

可以选择转到槽,自动生成一个槽函数

三、代码化UI设计

创建工程文件时不勾选创建界面

写到这里发现自己用的qt版本低打不开书中的qt源码,所以要装个qt5.9,顺便送个小彩蛋

QT5.9.1的下载安装和配置

1、QWDlgManual类定义

#ifndef QWDLGMANUAL_H
#define QWDLGMANUAL_H

#include <QDialog>

#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>


class QWDlgManual : public QDialog
{
    Q_OBJECT

private:  //声明了界面的各个组件的指针变量,界面组件都需要在QWDlgManual类的构造函数里创建并在窗体上布局
    QCheckBox   *chkBoxUnder;
    QCheckBox   *chkBoxItalic;
    QCheckBox   *chkBoxBold;

    QRadioButton    *rBtnBlack;
    QRadioButton    *rBtnRed;
    QRadioButton    *rBtnBlue;

    QPlainTextEdit  *txtEdit;

    QPushButton     *btnOK;
    QPushButton     *btnCancel;
    QPushButton     *btnClose;

    void    iniUI();//UI 创建与初始化  
    void    iniSignalSlots();//初始化信号与槽的链接

private slots:
    void on_chkBoxUnder(bool checked); //Underline 的clicked(bool)信号的槽函数

    void on_chkBoxItalic(bool checked);//Italic 的clicked(bool)信号的槽函数

    void on_chkBoxBold(bool checked); //Bold 的clicked(bool)信号的槽函数

    void setTextFontColor(); //设置字体颜色

public:
    QWDlgManual(QWidget *parent = 0);
    ~QWDlgManual();

};

#endif // QWDLGMANUAL_H

2、界面组件的创建于布局

(1)iniUI()实现界面组件的创建与布局

void QWDlgManual::iniUI()
{
//创建 Underline, Italic, Bold三个CheckBox,并水平布局
    chkBoxUnder=new QCheckBox(tr("Underline"));
    chkBoxItalic=new QCheckBox(tr("Italic"));
    chkBoxBold=new QCheckBox(tr("Bold"));

    QHBoxLayout *HLay1=new QHBoxLayout;
    HLay1->addWidget(chkBoxUnder);
    HLay1->addWidget(chkBoxItalic);
    
    HLay1->addWidget(chkBoxBold);

//创建 Black, Red, Blue三个RadioButton,并水平布局
    rBtnBlack=new QRadioButton(tr("Black"));
    rBtnBlack->setChecked(true);//缺省被选中
    rBtnRed=new QRadioButton(tr("Red"));
    rBtnBlue=new QRadioButton(tr("Blue"));

    QHBoxLayout *HLay2=new QHBoxLayout;
    HLay2->addWidget(rBtnBlack);
    HLay2->addWidget(rBtnRed);
    HLay2->addWidget(rBtnBlue);

//创建 确定, 取消, 退出 三个 QPushButton, 并水平布局
    btnOK=new QPushButton(tr("确定"));
    btnCancel=new QPushButton(tr("取消"));
    btnClose=new QPushButton(tr("退出"));

    QHBoxLayout *HLay3=new QHBoxLayout;
    HLay3->addStretch();
    HLay3->addWidget(btnOK);
    HLay3->addWidget(btnCancel);
    HLay3->addStretch();
    HLay3->addWidget(btnClose);


//创建 文本框,并设置初始字体
    txtEdit=new QPlainTextEdit;
    txtEdit->setPlainText("Hello world\n\nIt is my demo");

    QFont   font=txtEdit->font(); //获取字体
    font.setPointSize(20);//修改字体大小为20
    txtEdit->setFont(font);//设置字体

//创建 垂直布局,并设置为主布局
    QVBoxLayout *VLay=new QVBoxLayout;
    VLay->addLayout(HLay1); //添加字体类型组
    VLay->addLayout(HLay2);//添加字体颜色组
    VLay->addWidget(txtEdit);//添加PlainTextEdit
    VLay->addLayout(HLay3);//添加按键组

    setLayout(VLay); //设置为窗体的主布局
}

(2)信号与槽的关联

void QWDlgManual::iniSignalSlots()
{
//三个颜色  QRadioButton的clicked()事件与setTextFontColor()槽函数关联
    connect(rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
    connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
    connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//

//三个字体设置的  QCheckBox 的clicked(bool)事件与 相应的槽函数关联
    connect(chkBoxUnder,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxUnder(bool)));//
    connect(chkBoxItalic,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxItalic(bool)));//
    connect(chkBoxBold,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxBold(bool)));//

//三个按键与窗体的槽函数关联
    connect(btnOK,SIGNAL(clicked()),this,SLOT(accept()));//
    connect(btnCancel,SIGNAL(clicked()),this,SLOT(reject()));//
    connect(btnClose,SIGNAL(clicked()),this,SLOT(close()));//
}

测试效果

猜你喜欢

转载自blog.csdn.net/kenjianqi1647/article/details/83956385