目录
1.QString
QString是Qt中的字符串类,使用Unicode编码,而不是ASCII码。在C++中字符使用8位的char类型表示一个字符,但是在Qt中使用16位的QChar表示一个字符。因此Qt处理中文没有任何问题,并且一个汉字算作一个字符。
QString类整体使用与std::string类似,但是在API上有所不同。
常用函数如下:
●QString QString::number(int n, int base = 10) [static]
数字→字符串
参数1:要转换的数字
参数2:进制
●QString & QString::setNum(int n, int base = 10)
数字→字符串,支持链式调用
参数1:要转换的数字
参数2:进制
●int QString::toInt(bool * ok = 0, int base = 10) const
字符串→数字
参数1:转换的结果,成功或失败
参数2:进制
返回值:转换的结果,数字;如果失败,返回0。
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QString str = "你好吗αβγāáǎàあいうㅞㅝ";
qDebug() << str.size();
for(int i=0;i<str.size();i++)
{
qDebug() << str.at(i);
}
// 判断字符串是否为空
qDebug() << str.isEmpty();
str.append("fdf");
qDebug() << str;
// 基于16进制转换
int i = 16;
qDebug() << QString::number(i,16);
// 支持链式调用的转换
qDebug() << str.setNum(255,16).prepend("0x");
str = "0";
bool result; // 转换成功或失败的结果
// QString → int
int m = str.toInt(&result,10);
if(result)
qDebug() << "转换成功:" << m;
else
qDebug() << "转换失败:" << m;
}
Dialog::~Dialog()
{
delete ui;
}
由于QString类函数众多,无需死记每个函数,只需要把常用的函数单词记住,随用随查即可。
2.容器类
2.1QList
自定义一个C++类,作为QList的元素类型。
下面是创建自定义的C++类的步骤:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
3. 在弹出的窗口中,输入类名后点击“下一步”。
4. 在项目管理界面,直接点击“完成”。可以看到项目中多了新创建的类的头文件和源文件。
需要注意的是,QStringList类型基本等同QList
2.2QMap
dialog.cpp代码
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QMap<QString,QString> map;
// 增加元素
map["姓名"] = "张三";
map["年龄"] = "22岁";
map.insert("地址","济南市高新区");
// Qt的容器类型,如果元素类型支持输出
// 则可以直接输出容器对象
qDebug() << map;
// 取出元素之前先判断一下此键值对是否存在
if(map.contains("姓名"))
{
// 修改
map["姓名"] = "李四";
qDebug() << map["姓名"];
}
// 删除
// 失败返回0
int result = map.remove("地址");
if(result == 0)
qDebug() << "移除失败";
else
qDebug() << "移除成功";
// 也可以使用下面的方式取出元素,无需判断
// 参数1:键
// 参数2:取出失败的默认值
QString value = map.value("地址","404");
qDebug() << value;
qDebug() << "------STL迭代------";
for(QMap<QString,QString>::const_iterator iter = map.begin();
iter != map.end();iter++)
{
// 分别取出键和值
qDebug() << iter.key() << iter.value();
}
qDebug() << "---------Java迭代---------";
// 读写 QMutableMapIterator<Key, T>
// 只读 QMapIterator<Key, T>
QMapIterator<QString, QString> iter(map);
while(iter.hasNext())
{
iter.next(); // 向后移动
// 分别取出键和值
qDebug() << iter.key() << iter.value();
}
}
Dialog::~Dialog()
{
delete ui;
}
3.跨平台数据
Qt是一个跨平台的开发框架,为了确保在各个平台上的数据类型具有同一的长度,Qt为各种常用的基本数据类型定义了类型符号。
4.时间和日期处理
Qt拥有若干时间和日期相关类型,本次使用QDateTime类进行讲解。
QDateTime类常用函数如下所示。
●qint64 QDateTime::currentMSecsSinceEpoch() [static]
返回1970年1月1日 0点0分0秒到现在的毫秒数
●QDateTime QDateTime::currentDateTime() [static]
返回一个基于当前时区的时间和日期信息的QDateTime对象
●QString QDateTime::toString(const QString & format) const
返回一个自定义格式的时间日期字符串
参数是自定义的时间和日期格式。
时间和日期相关组件:
dialog.cpp代码
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
qint64 start = QDateTime::currentMSecsSinceEpoch();
ui->setupUi(this); // 创建ui界面文件中的组件对象
qDebug() << QDateTime::currentMSecsSinceEpoch()-start;
// 可以使用上面的时间戳作为随机数的种子
qsrand(start);
// 生成一个1-10的随机数
int rand = qrand()%10+1;
qDebug() << rand;
// 获取一个当前的QDateTime对象
QDateTime dt = QDateTime::currentDateTime();
// 获得一个自定义格式的时间和日期字符串
QString time = dt.toString("yyyy-MM-dd hh:mm:ss");
qDebug() << time;
connect(ui->dateTimeEdit,SIGNAL(dateTimeChanged(QDateTime)),
this,SLOT(dtChangedSlot(QDateTime)));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::dtChangedSlot(QDateTime dt)
{
QString time = dt.toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "组件当前数值:" << time;
}
dialog.h代码
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 头文件
#include <QDateTime>
#include <QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
private slots:
// 组件数值变化发射
void dtChangedSlot(QDateTime);
};
#endif // DIALOG_H
5.QTime定时器类
定时器类QTimer主要有两个功能:
●周期性执行某个动作
●延迟一段时间后执行某个动作
QTimer类与之前的QButtonGroup一样,需要手动控制堆内存对象的创建和销毁。
QTimer的常用属性如下所示。
●interval : int
如果是一次性的定时器,此属性表示延迟执行的时间;
如果是周期性的定时器,此属性表示间隔执行的时间。
时间单位毫秒。
●singleShot : bool
此属性表示定时器是否是一次性,如果不是一次性就是周期性。
QTImer的常用函数如下所示。
●void QTimer::start() [slot]
开始或重新开始定时器,如果定时器已经在运行,则会停止运行后再次运行。
●void QTimer::stop() [slot]
停止运行
●void QTimer::timeout() [signal]
定时器出发时发射的信号
dialog.cpp代码
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this); // 0
timeoutSlot(); // 手动刷新时间显示
// 创建定时器对象
timer = new QTimer(this);
// 设置间隔时间为1s
timer->setInterval(1000);
// 设置定时器为周期性
timer->setSingleShot(false);
// 连接定时器触发信号槽,注意发射者对象创建的时间
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
// 启动定时器
timer->start();
}
Dialog::~Dialog()
{
if(timer->isActive()) // 如果定时器正在运行
timer->stop(); // 停止定时器运行
delete timer;
delete ui;
}
void Dialog::timeoutSlot()
{
// 获取当前时间
QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
// 给QLCDNumber对象设置显示内容
ui->lcdNumber->display(time);
}
dialog.h代码
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 定时器头文件
#include <QTimer>
#include <QDateTime>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
// 定时器对象
QTimer* timer;
private slots:
// 触发信号连接的槽函数
void timeoutSlot();
};
#endif // DIALOG_H
6.多窗口编程
6.1消息对话框QMessageBox
QDialog是一个对话框窗口类,Qt为了方便程序员调用各种功能的对话框窗口,预设了很多QDialog的派生类,这些派生类分别应用于不同的场景。
这些派生类往往都通过一个静态成员函数调用,通常不需要使用构造函数创建对象。根据不同窗口的功能,这些静态函数会提供当前窗口的信息作为返回值。
QMessageBox是一个用于展示信息或询问用户一个问题的模态对话框,预设的类型有四种:
展示QMessageBox的静态成员函数如下所示。
函数名称可以更换为question、information、warning。
参数1:父对象
参数2:窗口标题
参数3:窗口信息
返回值:用户在弹窗中点击的按钮
6.2常见窗口类的继承关系
QWidget类本身也可以创建对象,其构造函数如下所示。
●QWidget::QWidget(QWidget * parent = 0)
如果parent参数使用默认值,QWidget对象就是一个独立的窗口;
如果parent参数不使用默认值,QWidget对象会成为其父窗口对象内部的组件。
QMainWidow类通常作为主窗口,因为此类可以增加菜单栏、工具栏、状态栏等。
QWidget类内部也有一些所有的窗口类共有的成员,例如:
●windowTitle : QString
窗口标题
●windowFlags : Qt::WindowFlags
窗口标记
●void QWidget::setWindowState(Qt::WindowStates windowState)
设置窗口状态
widget.cpp代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 全屏显示
// setWindowState(Qt::WindowFullScreen);
// 设置窗口标题
// setWindowTitle("哈哈哈哈哈");
// 设置无边框+上层浮动窗口
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
}
Widget::~Widget()
{
delete ui;
}
6.3主窗口类QMainWindow
QMainWindow作为窗口类,包含以下几个部分:
QMenuBar作为菜单栏,内部可以包含若干个菜单QMenu。
QMenu作为菜单,内部可以放置直接触发的QAction对象,也可以继续放置子菜单QMenu,形成二级或多级折叠的菜单。
上面的对象都是肉眼可见的,因此都属于ui指针管理。
QAction的常用信号如下所示。
●void QAction::hovered() [signal]
当鼠标悬停在QAction上发射此信号。
●void QAction::triggered(bool checked = false) [signal]
QAction直接或间接点击触发后发射的信号。