Qt 入门
1 初始函数
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //应用程序对象,必须有,且只能有一个
myMainWindow w;
w.show();
return a.exec(); //一个循环,当点到叉子时退出循环
}
- 默认创建有窗口类,myMainWindow, 基类有三种选择:QWidget、QM爱你Window、 QDialog
1.1 pro文件详解
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked 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 it uses 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 \
mymainwindow.cpp
HEADERS += \
mymainwindow.h
FORMS += \
mymainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
- QT:指定所要使用的Qt模块
- TARGET:指定编译后生成的目标文件名称
- TEMPLATE:指定编译后生成app 还是 lib
- DEFINES:预定义预处理器符号
- SOURCES:当前工程中的C++源文件
- HEADERS:当前工程中的C++头文件
- FORMS:当前工程中的ui文件
1.2 pushbutton常用API
- 创建:QPushButton* pb1 = new QPushButton
- 设置父亲: pb1->setParent(this)
- 设置大小: resize
- 改名称:setText
- 移动位置: move
#include "mymainwindow.h"
#include <qpushbutton.h>
myMainWindow::myMainWindow(QWidget *parent)
: QMainWindow(parent)
{
//创建一个按钮
QPushButton* pb1 = new QPushButton;
//让按钮放到页面中
pb1->setParent(this);
pb1->setText("first pushbutton");
pb1->resize(50,50);
//创建第二个按钮,按照控件大小创建窗口
QPushButton* pb2 = new QPushButton("第二个按钮",this);
//移动按钮
pb2->move(200,200);
//重置整个窗口大小
resize(1600, 400);
//将窗口大小固定死
setFixedSize(600,400);
//设置窗口标题
setWindowTitle("tyh·s windows");
}
myMainWindow::~myMainWindow()
{
}
1.4 窗口坐标系
坐标体系:
- 以左上角为原点(0,0),X向右增加,Y向下增加
1.5 打印函数
#include <QDebug>
qDebug()<<"打印信息”;
1.6 信号与槽函数
Signals
- clicked() 点击
- pressed() 按压
- released() 释放
- toggled() 切换
连接函数:connect
断开信号:disconnect
- 一个信号可以连接多个槽函数
- 信号是可以连接信号的
- 多个信号可以连接同一个槽函数
code 添加链接描述
//点击我的按钮,关闭窗口
//参数1:信号的发送者, 参数2 发送信号(函数的地址) 参数3 信号的接收者 参数4 处理的槽函数
connect(pb1, &QPushButton::clicked, this, &myMainWindow::close);
1.7 自定义信号和槽函数
重载问题解决:因为重载 无法判断函数地址,具有二义性,而函数指针可以锁定
- 利用函数指针
void (Teacher::*teacherSignal)(Qstring) = &Teacher::hungry; #找到 void void Teacher::hungry(Qstring)
void (Teacher::*teacherSignal)(void) = &Teacher::hungry; // 找到 void void Teacher::hungry()
void(Student::*studentSlot)(Qstring) = &Student::treat;
connect(zt, teacherSignal,st, studentSlot());
classIsOver();
lamda表达式在连接上的使用
int m = 10;
connect(pb1, &QPushButton::Clicked,this, [m]()->void{m = 100+10; QDebug<<m;}
2 对象模型(对象树)
一、问题
为什么Qt使用new来创建一个控件,但是却没有使用delete来进行释放?
二、对象树与拥有权
Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象。
当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象被销毁时,这个QObject也会被销毁。实践表明,这个机制非常适合于管理GUI对象。
举个例子,QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。
当然,我们也可以自己删除子对象,它们会自动从其父对象列表中删除。比如,当我们删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示。
对于Widget中的部件,如果是在堆上创建(使用new操作符),那么只要指定Widget为其父窗口(创建时指定parent参数为this)就可以了,也不需要进行delete操作。整个应用程序关闭时,会去销毁对象,而此时又会自动销毁它的所有子部件,这些都是Qt的对象树所完成的。
3 QMainWindow
一个QMainWindow包括
- 一个菜单栏:Menu Bar
- 多个工具栏: tool Bar
- 多个锚接部件:Dock Widget
- 一个状态栏:Status Bar
- 一个中心部件:Central Widget
头文件:
#include <QMenuBar>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
3.1 菜单栏MenuBar
一些基本操作:
#include "mymainwindow.h"
#include "ui_mymainwindow.h"
#include <QMenuBar>
myMainWindow::myMainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::myMainWindow)
{
ui->setupUi(this);
resize(600, 400);
//从QMainWindows中创建菜单栏,只能有一个
QMenuBar* bar = menuBar();
setMenuBar(bar); //将菜单栏放入窗口中
// 添加菜单
QMenu* fileMenu = bar->addMenu("文件");
QMenu* editMenu = bar->addMenu("编辑");
//创建菜单项
fileMenu->addAction("新建");
//添加分割线
fileMenu->addSeparator();
fileMenu->addMenu(("open"));
}
3.2 工具栏ToolBar
//工具栏
QToolBar* toolbar1 = new QToolBar;
QToolBar* toolbar2 = new QToolBar;
addToolBar(Qt::LeftToolBarArea, toolbar1);
//后期设置,只允许 左右停靠
toolbar1->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置浮动开关,不让其浮动
toolbar1->setFloatable(false);
QPushButton* pb = new QPushButton();
toolbar1->addWidget(pb);
toolbar1->addAction("open");
3.3 状态栏statusbar
//状态栏
QStatusBar* stbar = new QStatusBar(this);
stbar->move(200,100);
QLabel* label1 = new QLabel("提示信息",this);
stbar->addWidget(label1);
QLabel* label2 = new QLabel("右侧提示信息",this);
stbar->addPermanentWidget(label2); //addPermanentWidget:在状态栏中永久添加给定的窗口小控件
3.4 铆接部件QDockWidget
//铆接部件(浮动窗口)
QDockWidget* dock = new QDockWidget("浮动",this);
3.5 设置中心部件
// 设置中心部件,只能一个
QTextEdit* edit = new QTextEdit(this);