Qt Create常用类及多窗口编程

本文介绍了Qt库中的关键类,如QString用于Unicode编码的字符串处理,QList和QMap作为容器类存储数据,以及跨平台数据类型的处理。此外,还讨论了时间日期的QDateTime类,QTime定时器的使用,以及多窗口编程中的消息对话框QMessageBox和主窗口类QMainWindow的应用。
摘要由CSDN通过智能技术生成

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直接或间接点击触发后发射的信号。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值