一、ui的类与cpp的类
- 创建一个初始工程,cpp里边有一个类MainWindow,ui文件也有MainWindow类
- 在cpp里将ui里的类MainWindow放入命名空间UI中,并在cpp的MainWindow类里定义一个成员变量UI::MainWindow指针
- cpp的MainWindow的构造函数中,使用初始化列表构造一个UI::MainWindow成员,并使用ui->setupUi(this)绑定两个MainWindow
二、三个窗口类
- QWidget,可以不指定父对象单独个体也可以指定父对象实现内嵌,作为独立个体需要show方法显示
- QDialog,只能实现为单独个体(即使指定父对象),非模态显示show方法,模态显示exec方法(会卡住)
- QMainWindow,只能实现为独立个体,包含菜单栏、工具栏(可多个)、状态栏
三、内存回收机制
- 构造时指定的QParent成员,会形成一个对象树,或使用QObject提供的方法setParent指定成员
- 对象树中的成员删除时,将其从parent的children中移除,并对其所有的children删除
四、将qDebug()打印到终端
- pro文件加
CONFIG += console
五、QByteArray和QString
- QByteArray的类型转换,data方法,QByteArray转char*;setNum方法,int/long/char类型转QByteArray;toxx,QByteArray转xx类型
- QString的类型转换,fromStdString方法,c++标准string到QString;toStdString方法,QString转为std::string;toUtf8方法,QStirng转QByteArray;构造方法,QByteArray转QStirng;toUpper转大写,toLower转小写
六、QVariant类
- 自定义一个结构体,使用Q_DECLARE_METATYPE(Type)实现一个默认构造函数和拷贝构造函数
- 实例化结构体,使用fromValue转化为QVariant类型,使用QVariant的canConvert()判断能否转换为T类型,使用value()转换为T类型
- T类型可以是自定义类型,也可以是QVariant构造函数中可以转化的类型
七、位置尺寸类
- QPoint,有得到值x,y,有得到引用rx,ry,运算符重载
- QLine,两点得一线
- QSize,描述大小,有scale,成员长、宽
- QRect,描述矩形,点和大小
八、时间日期类
- QDate、QTime、QDateTime
QDateTime now = QDateTime::currentDateTime(); now.toString("yyyy-MM-dd hh:mm:ss")
九、信号和槽
connect(QObject* send, PointerToMemberFuncion signal, QObject* recv, PointerToMemberFuncion slot)
- 标准控件有相应的信号和槽处理函数
- 自定义的信号和槽函数所属的类必须从QObejct派生,加入
Q_OBJECT宏
- 自定义信号,返回值void,不需要实现,使用signals声明,信号可以重载
- 自定义槽函数,参数返回值和信号相同,可以是类成员函数、全局函数、静态函数、匿名函数,支持重载
- 重载的槽函数和信号connect时,使用
static_cast<void(CLASS::*)(args)>显式指定类型
- 一个信号可以绑定多个槽,但是槽函数触发时间不定,多个信号绑定一个槽,同一个处理函数
- disconnect和connect相反逻辑
十、Lambda表达式
[捕获](参数)opt->ret{主体}
- []表示不捕获,[=]值拷贝捕获,[&]引用捕获,[bar]特定变量的值捕获,[&bar]特定变量的引用捕获
- mutable选项,值拷贝的捕获变量可以在函数主体中修改
十一、QTimer类
- 重复触发的定时器,new出一个QTimer,isActive判断是否在运行,start开始参数指定间隔默认重复触发,stop停止
- singleShot方法,mes毫秒后单次触发信号,调用回调函数
- 父对象,构造时设置、调用setParent设置、调用parentWidget获取父对象(不是继承意义上的)
- 位置,geometry,move方法
- 尺寸,size、height、width
- 图标、标题,icon、title
- 信号,customContextMenuRequested右键触发此信号
- 槽函数,显示close、hide、show、setEnable、setDisable等
十三、QDialog类
- 模态显示窗口,exec方法
- accept槽函数,隐藏模态窗口,解除exec的阻塞,exec返回值设为QDialog::Accepted
- reject槽函数,隐藏模态窗口,解除exec的阻塞,exec返回值设为QDialog::Rejected
- done槽函数,隐藏模态窗口,解除exec的阻塞,exec返回值设为done的参数r
- 信号,accepted、rejected、finished
十四、QMessageBox类-QDialog的子类
- 只使用静态方法,显示模态对话框,消息、错误、问题、警告
- about、information方法,消息
- question方法,问题
- warnning方法,警告
- critical方法,错误
- QMessageBox::StandardButton枚举,有许多可以用的按键可以在模态对话框中显示
十五、QFileDialog类-QDialog的子类
- 只使用静态方法,打开文件夹、文件,返回QString或QStringList
- getExistingDirectory、getOpenFileName、getOpenFileNames、getSaveFileName
- 重要参数,过滤器,
"Image(*.jpg *.png);; Text(*.txt)"
十六、QFontDialog类-QDialog的子类
- 使用静态方法,getFont返回了一个QFont对象
- getFont方法,bool、默认QFont、parent、标题
- Font的构造函数参数,字体字符串、字号、加粗、倾斜
十七、QColorDialog类-QDialog的子类
- 静态方法getColor方法,使用模态对话框得到一个QColor
- QColor对象,有红绿蓝、透明度的属性
- 静态方法,可以输入Int、Float、可选的Qstring、可输入的单行QString、可输入的多行QString
- getInt,step参数,上下方向键的步长
- getDouble,decimals参数,浮点数的精度
- getItem,从一个QStringList中选择一个QString,editable参数,编辑选项
- getText,从LineEdit填入字符串,有EncoMode参数,选择Password,字符串变成点
- getMultiLineText,可以编辑的多行字符串填入,返回QString
十九、QProgressDialog类-QDialog的子类
- 构造函数参数,提示信息字符串、返回按键字符串、最小值、最大值、父对象
- 主要成员:labelText(提示信息标签)、cancelbutoton(返回按键信息)、最大值、最小值、value(进度条值)、autoReset(进度条满自动复位)、autoClose(进度条满自动关闭)、setWindowModality(设置显示模态/非模态)Qt::NonModal->非模态 Qt::WindowModal-> 模态,阻塞父窗口Qt::ApplicationModal -> 模态, 阻塞应用程序中的所有窗口
- 信号,返回按键按下会发出信号canceled
- 槽函数,cancel、reset复位对话框
二十、QMainWindow类
- 菜单栏,菜单和菜单项对应QMenu和QAction,添加菜单和菜单项均可以在UI编辑器中实现,或通过addMenu、addAction实现
- 菜单栏的菜单项被点击会发出信号triggered
- 工具栏,Mainwindow右键添加一个或多个toolbar,toobar可以添加QAction,也可以添加QWidget,有一些属性,moveable、floatable等
- 状态栏,类型QStatusBar,方法addWidget、insertWidget、showMessage方法
- 只有在MainWidow的停靠窗口才能移动和浮动
- 还有一些停靠、浮动、关闭等等属性
二十二、qrc的设置
- 选择项目,新加一个qrc的资源文件
- 设置前缀
/
- 添加资源文件
- 右键可以copy路径,或者直接添加资源
二十三、布局的使用
- 布局分类:水平布局、垂直布局、网格布局
- 基于UI界面的两种布局方法,一是直接拖拽Layouts控件,二是使用QWidget控件作为容器,并右键选择布局形式(推荐)
- 弹簧的使用(spacer)、弹簧的默认属性是expanding,也可以设置为fixed,设置固定的高度和宽度
- 通过widget设置布局,每个widget都有一个layout属性,margin设置控件的边界大小,space设置控件的间隔
二十三、基于鼠标事件的右键菜单
- 重写void mousePressEvent(QMouseEvent *event);
- 如果event的button是Qt::RightButton,则创建一个Menu,并添加对应的QAction、可以关联QAction的triggered信号执行槽函数
- 最后在鼠标位置模态显示菜单,
menu->exec(QCursor::pos())
二十四、基于窗口的菜单策略实现
# 策略1
setContextMenuPolicy(Qt::DefaultContextMenu);
重写事件处理函数void MainWindow::contextMenuEvent(QContextMenuEvent *event);
创建菜单、添加菜单项、关联信号和槽函数、菜单模态显示
# 策略2
setContextMenuPolicy(Qt::ActionsContextMenu);
添加菜单项QAction到窗口对象,关联信号和槽函数
# 策略3
this->setContextMenuPolicy(Qt::CustomContextMenu);
关联信号void QWidget::customContextMenuRequested(const QPoint &pos)到槽函数
槽函数创建菜单、添加菜单项、关联信号和槽函数、菜单模态显示