QT开发入门总结

1. QT类介绍

QMainWindow、QWidget、QDialog的区别

QWidget

QWidget类是所有用户界面对象的基类。

窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且将自己的表现形式绘制在屏幕上。每一个窗口部件都是矩形,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有字体属性,但是自己从来不用。为很多继承它的子类提供了实际的功能,比如QLabel、QPushButton、QCheckBox等等。

没有父窗体的小部件始终是一个独立的窗口(顶级窗口部件)。非窗口的小部件为子部件,它们在父窗口中显示。Qt中大多数部件主要被用作子部件。例如:可以显示一个按钮作为顶层窗口,但大多数人更喜欢将按钮内置于其它部件,如QDialog。

QMainWindow

QMainWindow类提供一个有菜单条、工具栏、状态条的主应用程序窗口(例如:开发Qt常用的IDE-Visual Studio、Qt Creator等)。

QDialog

QDialog类是对话框窗口的基类。

2. pro文件解释

TEMPLATE = app #模板,应用程序模板 lib 建立一个库的模板,

CONFIG *= warn_on
CONFIG(debug, debug|release): CONFIG *= console
# With C++11 support
greaterThan(QT_MAJOR_VERSION, 4){ #大于4版本以上,使用C++11
    CONFIG += c++11
} else {
    QMAKE_CXXFLAGS += -std=c++11
}

QT += widgets #QT包含的模块

#------------------------------------------------------------
# Source Files
#------------------------------------------------------------

FORMS += \
    GUIDemo.ui \
    Registration.ui \

HEADERS += \
    CustomFrames.h \
    GUIDemo.h \
    MultiRadar.h \
    OverlayManager.h \
    QControlUtils.h \
    TargetModel.h \
    ScannerInfo.h \
    BaseTab.h \
    BaseSpokesTab.h \
    TabAdvanced.h \
    TabBScan.h \
    TabGuardZone.h \
    TabImage.h \
    TabInstallation.h \
    TabFeatures.h \
    TabSectorBlanking.h \
    TabPPI.h \
    TabTargets.h \
    TabNavigation.h \

SOURCES += \
    CustomFrames.cpp \
    GUIDemo.cpp \
    MultiRadar.cpp \
    OverlayManager.cpp \
    QControlUtils.cpp \
    TargetModel.cpp \
    ScannerInfo.cpp \
    BaseTab.cpp \
    BaseSpokesTab.cpp \
    TabAdvanced.cpp \
    TabBScan.cpp \
    TabGuardZone.cpp \
    TabImage.cpp \
    TabInstallation.cpp \
    TabFeatures.cpp \
    TabSectorBlanking.cpp \
    TabPPI.cpp \
    TabTargets.cpp \
    TabNavigation.cpp \
    main.cpp \

#------------------------------------------------------------
# Include directories
#------------------------------------------------------------

INCLUDES = \
    ../../include \
  
#------------------------------------------------------------
# UI Generation
#------------------------------------------------------------

CONFIG(debug,   debug|release): TARGET_DIR = debug
CONFIG(release, debug|release): TARGET_DIR = release

UI_DIR = GeneratedFiles
MOC_DIR = $${UI_DIR}/$${TARGET_DIR}
INCLUDEPATH += $${UI_DIR}

#------------------------------------------------------------
# Libraries
#------------------------------------------------------------

LIBS += \
    -L../../lib/$${TARGET_DIR} \
      -lNRPClient \
      -lNRPPPI \
   
#------------------------------------------------------------
# Final config
#------------------------------------------------------------
  
#set the qmake variables
DEPENDPATH += $$INCLUDES
INCLUDEPATH += $$INCLUDES

3. 快捷键

运行Ctrl+r

编译ctrl+b

整行移动 ctrl+shift+↑

帮助文档F1

自动对齐ctrl+i

同名之间的.h与.cpp之间切换F4

4.创建按钮

QPushButton * btn = new QPushButton;
btn->setParent(this);
btn->setText("显示按钮");
QPushButton * btn2 = new QPushButton("第二个",this);
btn2->move(100,200);
resize(600,400);//重置窗口大小
setWindowTitle("第一个窗口");
setFixedSize(800,600);//设定固定窗口大小

5.对象模型(对象树)

QT中动态分配内存(new)对象,如果指定父类对象,则不需要手动析构,因为QT中有对象树。

6.QT的窗口坐标系

QT的坐标系为左上角,x轴为向右,y轴为向下。

7.信号和槽

连接函数connect(btn2, &QPushButton::clicked, this, &QWidget::close);

参数1,信号的发送者

参数2,发送的信号(函数的地址)

参数3,信号的接受者

参数4,处理的槽函数(函数的地址)

7.1 自定义信号

写在类的signals下面,返回值为void,只需要声明,不需要实现。可以有参数,可以发生重载

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

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

signals:
    //自定义信号 写到signals下面
    //返回值是void, 只需要声明,不需要实现
    //可以有参数,可以发生重载
    void hungry();
};

#endif // TEACHER_H

7.2 自定义槽函数

写在类的public slots之下,返回值为void,需要声明,也需要实现,可以有参数,可以发生重载。

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

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

public slots://早期的qt必须把槽函数写到public slots下
    //返回值void ,需要声明,也需要实现
    //可以有参数,可以发生重载
    void treat();
};

#endif // STUDENT_H

7.3 信号槽的触发

connect(zt, &Teacher::hungry, st, &Student::treat);
emit zt->hungry();

7.4 重载的信号和槽

7.4.1 需要使用函数指针,明确指向函数的地址

void(Teacher:: *teacherSignal)(QString) = & Teacher::hungry;
void(Student:: *studentTreat)(QString) = & Student::treat;
connect(zt, teacherSignal, st, studentTreat);

7.5 QString 转成 char*

正常QString的Debug输出,会输出"Data",会有两边的双引号,想消除,必须使用char,或者const char

qDebug()<<"憋说了,我给你买:" << foodName.toUtf8().constData();//Data()转成char*

7.6 自定义按钮连接信号

1. 信号可以直接连接至信号,信号也可以直接连接至槽

2. 相互连接的信号和信号,信号和槽参数类型必须相同

3. 但是信号的参数个数可以对于槽函数的参数个数

4. 同一个信号可以连接至多个槽函数

5. 多个信号可以连接至同一个槽函数

QPushButton * btn = new QPushButton("我饿了",this);
this -> st = new Student;
this -> zt = new Teacher;
void(Teacher:: *teacherSignal)(void) = & Teacher::hungry;
void(Student:: *studentTreat)(void) = & Student::treat;
connect(zt, teacherSignal, st, studentTreat);
connect(btn,&QPushButton::clicked,zt,&Teacher::hungry);
//不管什么时候,信号和槽的参数列表必须一致,所以需要指定参数列表

信号断开

disconnect(btn,&QPushButton::clicked,zt,&Teacher::hungry);

7.7QT4的信号和槽的连接

// 必须在信号前面加SIGNAL(hungry()), 槽函数前面加SLOT()
// 缺点:参数不做检测
connect(zt, SIGNAL(hungry()), st, SLOT(treat()));//无参函数,SLOT(),槽函数必须使用public slots:
connect(zt, SIGNAL(hungry(QString), st, SLOT(treat(QString)));//有参函数

7.8 槽函数使用Lambda表达式(C++11)

QT5.4之前的版本必须在QT的工程文件里面加入:

CONFIG += c++11

其他请见

connect中的槽函数使用Lambda函数

connect(btn, &QPushButton::clicked, this, [&](){
    this->close();
    st->treat();
})

8. QMainWindow

QMainWindow包含一个菜单栏(menu bar),多个工具栏(tool bars), 多个锚接部件(dock widgets)、一个状态栏(satus bar)及一个中心部件(central widget),是许多引用程序的基础, 如文本编辑器,图片编辑器等。

8.1 菜单栏

头文件:#include <QMenuBar>

  1. 菜单栏最多只有一个
  2. 创建菜单栏QMenuBar *menubar = menuBar();
  3. 设置菜单栏setMenuBar(menubar);
  4. 添加菜单栏QMenu * fileMenu = menubar->addMenu("文件"); //菜单栏为空时什么也不显示
  5. 新建QActionQAction * newFileAct = fileMenu->addAction("新建");
  6. 新建分割线fileMenu->addSeparator();//添加分割线

8.2 工具栏

头文件:#include <QToolBar>

  1. 工具栏可以有多个
  2. 新建工具栏QToolBar *toolBar = new QToolBar(this);
  3. 设置工具栏,并指定默认位置addToolBar(Qt::LeftToolBarArea, toolBar);//工具栏指定位置
  4. 指定工具栏的停靠位置toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
  5. 不允许浮动toolBar->setFloatable(false);
  6. 不允许移动toolBar->setMovable(false);
  7. 工具栏中添加ActiontoolBar->addAction(newFileAct);//与上文使用同一个action
  8. 工具栏中添加分隔符toolBar->addSeparator();
  9. 工具栏中添加小控件QPushButton *btn = new QPushButton("点我",this);toolBar->addWidget(btn);

8.3 状态栏

头文件#include <QStatusBar>

标签类头文件#include <QLabel>

  1. 状态栏可以有多个
  2. 新建状态栏QStatusBar * mystatusBar = statusBar(); setStatusBar(mystatusBar);//标签控件为空时不显示
  3. 状态栏里面放信息,放左侧QLabel * pLabel = new QLabel("提示信息", this);mystatusBar->addWidget(pLabel);
  4. 放右侧QLabel * pLabel_R = new QLabel("右侧提示信息",this);mystatusBar->addPermanentWidget(pLabel_R);

8.4 设置铆接部件

锚接部件#include <QDockWidget>

  1. 创建锚接部件QDockWidget * pDockWidget = new QDockWidget("铆接部件",this);
  2. 添加锚接部件,并指定锚接部件的位置addDockWidget(Qt::BottomDockWidgetArea,pDockWidget);//指定下面

8.4 设置中心部件

文本框部件#include <QTextEdit>

  1. 中心部件只能有一个
  2. 创建一个文本框QTextEdit *pTextEdit = new QTextEdit("文本编辑器",this);
  3. 设置中心部件setCentralWidget(pTextEdit);

9. 资源文件

9.1 ICON

  1. 将图片拷贝到指定位置
  2. 如果是编译工具链使用的是Cmake,只能设置文件的相对路径
  3. 将action设置QIcon:ui->actionOpenFile->setIcon(QIcon("../004/Rader2.png"));
  4. 如果需要使用资源文件,首先生成资源文件。
  5. 右键项目->添加新文件->Qt->Qt Recourse File ->给资源文件起名字
  6. open in editor 编辑资源
  7. 添加前缀->添加文件
  8. 将action设置QIcon:ui->actionNewFile->setIcon(QIcon(":/Rader.png"));

rader2rader1

10. 对话框

10.1 创建对话框

对话框头文件#include <QDialog>

//点击新建按钮,弹出一个对话框
//使用lambda函数可不用给指针
connect(ui->actionNewFile,&QAction::triggered,[&](){
    //对话框 模态对话框(不可以对其他窗口进行操作) 非模态对话框(可以对其他窗口进行操作)
    //模态创建
    QDialog dlg(this);
    dlg.exec();
    QDialog *dlg1 =new QDialog(this);//必须创建在堆区,否则为临时变量,会被析构,不会显示窗口
    dlg1->setAttribute(Qt::WA_DeleteOnClose);//设置属性在关闭时删除
    dlg1->show();
    qDebug() << "模态对话框";
});

10.2 标准对话框

头文件:#include <QMessageBox>

  • QcolorDiaglog-选择颜色对话框
  • QFileDialog-选择文件或目录的对话框
  • QFontDialog-选择字体对话框
  • QInputDialog-允许用户输入一个值,并将其值返回
  • QMessageBox-模态对话框,用于显示消息,询问问题等
  • QPageSetupDialog-为打印机提供纸张相关的选项
  • QPrintDialog-打印机配置
  • QPrintDialog-打印预览
  • QProgressDialog-显示操作过程
//错误对话框
QMessageBox::critical(this,"错误","非法访问");
//信息对话框
QMessageBox::information(this,"请注意","来了老弟!");
//提问对话框 父亲 参数2 标题 参数3 提示内容 参数4 按键类型 参数5 默认关联回车按键,可以通过返回值查看选择的类型
QMessageBox::StandardButton reButtun = QMessageBox::question(this,"继续","请问继续吗?",QMessageBox::Ok|QMessageBox::Retry,QMessageBox::Retry);
if(reButtun == QMessageBox::Retry)
{
    qDebug() <<"用户选择重试";
}
QMessageBox::warning(this,"警告","出错了,且不可挽回");
QColor col= QColorDialog::getColor(QColor(211,5,35));//颜色对话框 、必须包含头文件#include <QColorDialog>
qDebug() << " " << col.red() << " " << col.green() << " " << col.blue();
// this 弹窗名字 打开位置
QString  fileName = QFileDialog::getOpenFileName(this,"打开文件",".","(*.txt)");//文件对话框 #include <QFileDialog>
bool flag;
QFont mfont = QFontDialog::getFont(&flag, QFont("华文彩云",72),this,"请选择字体");//#include <QFontDialog>