Qt_Dev_Summarize
第0章 前言
系统结构及开发体系
嵌入式系统结构: |
---|
应用软件 |
嵌入式操作系统 |
以微处理器 / 控制器为核心的硬件平台 |
嵌入式开发体系 | |
---|---|
应用开发 | C / C++ Qt JAVA SHELL GNU LIB |
操作系统 | LINUX Android FreeRTOS QNX vxWorks |
固件及驱动 | UBOOT VIVI 驱动开发 |
处理器 | ARM |
外围设备 | I2C USB SPI 传感器 LCD 触摸屏 KEY |
电子电路 | PCB IC FPGA |
GUI介绍
定义:图形用户界面,是计算机与其使用者之间的对话接口,是计算机系统的重要组成部分。
组成部分:桌面、视窗、菜单、按钮、图标
重要性:
- 使操作更加简单、更加快捷、更加人性化
- 对于应用程序的成功至关重要
常用GUI开发工具
- MFC(C++)
- WinForm(C)
- Qt(C++)
- GTK(C)
- Android SDK(Java)
- Object-C
- miniGUI(C)
Qt介绍
- Trolltech(奇趣)公司,多平台,C++图形用户界面应用程序框架
- 优秀特点
- 跨平台(Windows,Android,IOS,Linux)
- 一处编写,处处编译
第1章 基本创建
Qt 下载与安装
qt-opensource-windows-x86-mingw530-5.8.0.exe为例
- opensource=开源
- windows-x86=Windows平台
- mingw530=MinGW530编译器
- 5.8.0=版本号
新程序
- 文件 > 新建文件或项目
- Application > Qt Widgets Application
文件说明
.pro=项目文件
.pro.user=与用户相关项目信息
.ui=设计师设计的界面文件
发布
.pro加入RC_ICONS = myico.ico
代码构造
.pro文件
QT += core gui
//core(核心) gui(窗口系统集成)
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//如果Qt版本大于4,需要添加widgets模块
TARGET = mydialog2
//生成的文件名
TEMPLATE = app
//表示是个应用程序
SOURCES += main.cpp\
mywidget.cpp
HEADERS += mywidget.h
FORMS += mywidget.ui
//源文件,头文件和界面文件
RC_ICONS = myico.ico
//添加应用程序图标
.cpp文件
#include <QApplication>
#include <QDialog>
#include <QLabel>
//#include "ui_hellodialog.h"
int main(int argc,char *argv[])
//argc=argument count
//argv=argument vector
{
QApplication a(argc,argv);
QDialog w;
w.resize(400,300);
//宽和高,单位像素
QLabel label(&w);
label.setText(QObject::tr("Hello World!"));
//QObject::tr=多语言支持
w.show();
//默认情况下,新建的可视对象都是不可见的
return a.exe();
//进入事件循环
}
//UTF-8保存
.ui文件
- xml文件
- 生成ui_hellodialog.h
第2章 窗口部件
QWidget类关系树
[外链图片转存中…(img-msQhrO79-1592474435664)]
[外链图片转存中…(img-swtYLbGn-1592474435669)]
QWidget是所有用户界面的基类,被称为基本窗口部件
Qt Creator提供的默认三个窗口基类:
QMainWindow:带有菜单栏和工具栏的主窗口类;
QDialog:是重要的信息显示和获取输入数据的用户界面对象,是各种对话框的基类;
QWidget: QWidget类是所有用户界面对象的基类,被称为基础窗口部件,继承自QObject类和QPaintDevice类。所有的窗口部件都继承自QWidget。
QWidget
- 窗口部件(Widget):简称部件,是Qt中建立用户界面的主要元素。像主窗口、对话框、标签、还有以后要介绍到的按钮、文本输入框等都是窗口部件。
- 窗口:把没有嵌入到其他部件中的部件称为窗口,一般的,窗口都有边框和标题栏,就像程序中的widget和label一样。
- 窗口就是没有父部件的部件,所以又称为顶级部件(top-level widget)。
- 子部件(child widget):非窗口部件。在Qt中大部分部件被用作子部件,嵌入在别的窗口中。
//QLabel类型
QLabel *label=new QLabel();
//无父窗口
QLabel *label2=new QLabel(widget);
//widget为父窗口指针
//父对象销毁时也会销毁子对象
//函数原型:
QWidget *widget = new Qwidget(QWidget *parent;Qt::WindowFlags f);
//parent=父窗口指针
//f=Qt::WidgetType枚举类型的值或者组合
几何布局
setWindowState()
设置窗口状态
参数类型:Qt::WindowStates,
枚举值(Qt::WindowMaximized最大化 Qt::WindowMinimized最小化 Qt::WindowFullScreen全屏 Qt::WindowActive活动窗口 Qt::WindowNoState默认)x(),y(),frameGeometry(),pos(),move()
包含框架的位置函数,
距离左边缘的x ,距离上边缘的y,两者结合posgeometry(),width(),height(),rect(),size()
不包含框架的函数
内左上角坐标geometry(),内宽度width(), 内高度height()- resize()
调整窗口大小,单位像素
[外链图片转存中…(img-8TZ8mu7s-1592474435672)]
qDebug()
- 添加
#include <QDebug>
- 把
qDebug()
当作cout
用 - 在应用程序输出窗口可以看到信息
QDialog
模态和非模态
模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互。
非模态对话框是既可以与它交互,也可以与同一程序中的其他窗口交互。
dialog指明了父窗口就不用delete来释放对象了
QDialog *dialog = new QDialog(this);
dialog->show();//非模态对话框
//或者
QDialog dialog(this);
dialog.exec();//模态对话框
//函数返回一个DialogCode结果。
//enum DialogCode { Rejected, Accepted }
QDialog *dialog = new QDialog(this);
dialog->setModal(true);//修改模态
dialog->show();
信号与槽
必须添加Q_OBJECT宏
在类定义第一行添加
Q_OBJECT
.h类声明中添加信号
signals:
void dlgReturn(int);
.h类声明中添加槽函数
public slots:
void showChildDialog();
普通函数中发射信号
void MyDialog::on_pushButton_clicked()
{
int value=ui->spainBox->value();//获取输入的值
emit dlgReturn(value);//发射信号
close();//关闭Dialog
}
.cpp文件实现槽函数
void MyWidget::showChildDialog()
{
QDialog *dialog =new QDialog(this);
dialog->show();
}
- 一个信号可以关联到多个槽上面
- 多个信号可以关联到一个槽上面
- 一个信号可以关联到另一个信号
- 一个信号关联到多个槽上面时无法指定执行顺序
信号与槽的关联
connect()关联
函数原型
bool QObject::connect(const QObject *sender,const char*signal,const QObject *receiver,const char*method,Qt::ConnectionType type=Qt::AutoConnection)
sender : 发送信号的对象
signal : 发送的信号(使用SIGNAL()
包裹或者使用&Singal::
前缀)
receiver : 接收信号的对象
method : 要执行的槽函数(使用SLOT()
包裹或者使用&Reveiver::
前缀,槽函数中无参数)
Qt::ConnectionType : 关联方式
[外链图片转存中…(img-ck1CKmEn-1592474435676)]
关联成功返回 true
注意:信号参数可以多于槽函数参数,但多余参数会被忽略。
设计模式关联
- 首先添加自定义对话框类MyDialog。在设计模式中向窗口上添加两个Push Button,并且分别更改其显示文本为“进入主界面”和“退出程序”
- 点击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4,这时便进入了部件的信号和槽的编辑模式。在“退出程序”按钮上按住鼠标左键,然后拖动到窗口界面上,这时松开鼠标左键。
- 在弹出的配置连接对话框中,选中下面的“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后按下“确定”。
自动关联
在“进入主界面”按钮上右击,在弹出的菜单上选择“转到槽”,然后在弹出的对话框中选择clicked()信号,并按“确定”
。这时便会进入代码编辑模式,并且定位到自动生成的on_pushButton_clicked()槽中。
在其中添加代码:
void MyDialog::on_pushButton_clicked()
{
accept();
}
自动关联就是将关联函数整合到槽命名中。
由字符“on”和发射信号的部件对象名,还有信号名组成。
每当pushButton被按下,就会发射clicked()信号,然后就会执行on_pushButton_clicked()槽。
标准对话框
颜色对话框
头文件:<QColorDialog>
参数:
QColorDialog color=QColorDialog::getColor(Qt::red,this,tr("标题"),QColorDialog::ShowAlphaChannel)
- getColor()获取颜色
- Qt::red=设置初始颜色
- this=指定父窗口
- tr("")=设置窗口标题
- QColorDialog::ShowAlphaChannel=透明度设置许可
文件对话框
头文件:<QFileDialog>
参数:
QString filename=QFileDialog::getOpenFileName(this,tr("标题"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)")
QStringList filenames=QFileDialog::getOpenFileNames(this,tr("标题"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)")
- filename=文件字符串
- getOpenFileName()=返回一个文件名字符串
- filenames=文件字符串列表
- getOpenFileNames()=返回一个文件名字符串列表
- this=指定父窗口
- tr(“标题”)=指定标题
- “D:”=默认路径
- tr(“图片文件(*png *jpg);;文本文件(*txt)”=文件筛选器,不同文件类型用
;;
分隔
字体对话框
头文件:<QFontDialog>
参数:
bool ok;
QFont font=QFontDialog::getFont(&ok,this)
- &ok=存放bool型变量(用来保存按钮被按下的状态)
- this=父窗口
- font=保存字体信息(
setFont()
参数)
输入对话框
头文件:<QInputDialog>
参数:
bool ok;
//获取字符串
QString string = QInputDialog::getText(this, tr("窗口标题"),tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
- this=父窗口
- tr(“窗口标题”)=设置窗口标题
- tr(“请输入用户名:”)=输入框标签
- QLineEdit::Normal=显示模式
- tr(“admin”)=默认值
// 获取整数
int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
- 100=默认值
- -1000=最小值
- 1000=最大值
- 10=使用箭头调整时跃迁值
// 获取浮点数
double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
- 2=小数点位数
QStringList items;
items << tr("条目1") << tr("条目2");
// 获取条目
QString item = QInputDialog::getItem(this, tr("输入条目对话框"),tr("请选择或输入一个条目"), items, 0, true, &ok);
- 0=默认显示第一条目
- true=条目可以被更改
消息对话框
头文件<QMessageBox>
参数:
int ret=QMessageBox::[question|information|warning|Abort|critical|YesAll](this, tr"标题", tr"显示内容", QMessageBox::[NO|Ok|Abort|YesAll])
- question|information|warning|Abort|critical|YesAll:问题/提示/警告/错误/严重错误对话框
- abort没有返回值
- QMessageBox::[NO|Ok|Abort|YesAll]=标准按钮
进度对话框
头文件:<QProgressDialog>
参数:
QProgressDialog dialog(tr"标题",tr"取消",0,50000,this
tr"标题":对话框标签内容
tr"取消":取消按钮的显示文本
0,50000:最小值和最大值
this:父窗口
setValue()
通过赋值推动进度条
QCoreApplication::processEvents()
不断调用以避免界面冻结
QProgressDialog::wasCancel()
判断是否按下取消按钮,是则返回1
错误信息对话框
.h文件,类前置声明class QErrorMessage
添加私有对象QErrorMessage *errordlg
.cpp文件
添加头文件#include <QErrorMessage>
构造函数中添加errordlg=new QErrorMessage(this)
设计槽函数
void MyWidget::on_pushButton_clicked()
{
errordlg->setWindowTitle(tr("错误信息对话框"));
errordlg->showMessage(tr("这里是出错信息"));
}
向导对话框
其他窗口部件
Frame类族
QLabel
用来显示文本或者图片
构造函数添加,字体设置代码
QFont font;
font.setFamily("华文行楷");
font.setPointSize(20);
font.setBold(true);
font.setItalic(true);
ui->label->setFont(font);
构造函数添加,添加图片
ui->label->setPixmap(QPixmap("图片地址"));
构造函数添加,添加动画
QMovie *movie =new QMovie("gif地址");
ui->label->setMovie(movie);//添加动画
movie-start//设置动画
QLCDNNumber
QStandWidget
QToolBox
按钮部件
QPushButton
成员:
setText(tr"")
=设置显示按钮
setIcon(QIcon("地址"))
=设置图标
setMenu(QMenu *menu)
=设置菜单(须头文件<QMenu>
)
QCheckButton
QRadioButton
QGroupButton
QLineEdit
单行文本编辑器
显示模式
echoMode:[Normal|NoEcho|Password|PasswordEchoOnEdit]=正常显示|不显示|密码样式|输入时正常显示
输入掩码
输入验证
自动补全
QAbstractSpainBox
QDataTimeEdit
QSpinBox和QDoubleSpinBox
QAbstractSlider
第3章 布局管理
布局管理系统
布局管理器
基本布局管理器
头文件:<QHBoxLayout>
(水平)和<QVBoxLayout>
(垂直)
函数:
addWidget(Widget及其子控件指针)
=向布局管理器中添加部件
setSpacing(int)
=部件间距,单位像素
setContentsMargins(int,int,int,int)
=布局管理器到四周的距离,单位像素,顺序左上右下
栅格布局管理器
毕业设计都写完了,不写了ヽ〔゚Д゚〕丿