(5)Qt—ui常用类

这篇具有很好参考价值的文章主要介绍了(5)Qt—ui常用类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. QString 字符串类*

2. 容器类

2.1 顺序容器 QList

2.2关联容器 QMap

3. Qt类型

3.1 跨平台数据类型

3.2 QVariant 统一数据类型 

4.QDate Time 日期时间类

 5.QTimer 定时器类


1. QString 字符串类*

QString是Qt中的字符串类,与C和C++不同的是,Qt的字符串使用Unicode编码。每一个字符使用一个16位的QChar,而不是之前8位的char,所以Qt处理中文没有问题,并且每个中文算作一个字符。

Qt是基于C++的开发框架,因此很多类会尽可能地兼容C++的API,QString支持绝大多数std::string的API,例如append、size、length、at、push_back等。除此之外,也有修改和新增的部分。

对于QString类的API,可以通过认识常用的英文单词查询文档使用。

qt ui,qt,ui,开发语言

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    // 支持多国语言
    QString text = "αβγあいうえおАБВ";
    qDebug() << text;
    qDebug() << text.size();    //字符串长度法1
    qDebug() << text.length();  //字符串长度法2
    qDebug() << text.count();   //字符串长度法3

    // int → QString
    // 参数1:要转换的数字
    // 参数2:进制,默认为十进制
    text = QString::number(11,16);
    qDebug() << text;

    // int → QString
    // 参数1:要转换的数字
    // 参数2:进制,默认为十进制
    // 返回值:QString& ,因此支持链式调用
    text.setNum(10,16).append("哈哈哈");
    qDebug() << text;

    // QString → int
//    int	toInt(bool * ok = 0, int base = 10) const
    // 参数1:表示转换是否成功
    // 参数2:进制,默认为十进制
    // 返回值:转换的结果,0表示失败
    text = "0";
    bool result; // 转换是否成功
    int i = text.toInt(&result);
    qDebug() << "是否成功:" << result;
    qDebug() << i;
}

Dialog::~Dialog()
{

}

qt ui,qt,ui,开发语言

2. 容器类

C++的STL容器类已经不适用于Qt的环境,因为Qt重新实现了部分容器类,据官方所说,Qt的容器类更加轻巧、安全和易于使用。Qt对这些容器类进行存储优化,可以使生成的exe可执行文件的体积减小,这些容器类是线程安全的,支持同时被多个线程进行只读访问,几乎支持C++的STL容器类的API,并在此基础上进行了扩充。

2.1 顺序容器 QList

先创建一个自定义的C++类,然后使用QList存储这个类的对象。

在Qt中创建一个自定义的C++类的操作步骤如下:

1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。

2. 在弹出的窗口中,按照下图所示进行操作。

qt ui,qt,ui,开发语言

3. 在弹出的窗口中,先给类命名(主题使用大驼峰命名法,即所有单词的首字母大写),然后点击“下一步”。

qt ui,qt,ui,开发语言

4. 在项目管理界面直接点击完成。可以看到在项目中已经有对应的头文件和源文件了。

qt ui,qt,ui,开发语言

QList除了支持C++的迭代器以外,还支持Java的迭代器,对应关系如下。

C++迭代器

等效的Java迭代器

QList<T>::const_iterator

QListIterator<T>

QList<T>::iterator

QMutableListIterator<T>

QStringList类基本等同于QList<QString>

 dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
//头文件
#include <QList>
#include "student.h"
#include <QDebug>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

student.h

#ifndef STUDENT_H
#define STUDENT_H

//引入头文件
#include <QString>
class Student
{
public:
    Student(QString,int,QString);

    QString getName() const;
    void setName(const QString &value);

    int getAge() const;
    void setAge(int value);

    QString getMajor() const;
    void setMajor(const QString &value);

private:
    QString name;
    int age;
    QString major;
};

#endif // STUDENT_H

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    //创建一个QList对象
    QList<Student> class23021;
    Student s1("张三",23,"电子信息科学与技术");
    Student s2("李四",25,"自动化");
    Student s3("王五",18,"计算机科学");
    Student s4("赵六",24,"物联网");
    Student s5("徐七",23,"电子信息工程");
    Student s6("孙八",18,"计算机科学");


    //增加元素
    class23021.push_back(s1); //向后追加
    class23021.append(s2);   //向后追加
    class23021.push_front(s3); //向前追加
    class23021 <<s1 <<s2 <<s3;  //连续追加
    class23021.insert(1,s4);  //在第二个位置插入 //参数1:位置 //参数2:元素值

    //删除元素
    class23021.pop_back();  //删除最后一个元素,同removeLast
    class23021.pop_front();  //删除第一个元素,同removeFirst
    //class23021.erase();
    class23021.removeAt(1); //删除第n个元素
    //int removeAll(const T & value)  删除所有相同的元素
    //bool QList::removeOne(const T & value) 删除第一个相同元素

    //更新元素
    class23021[1] = s5;
    //更新元素
    //参数1:元素位置
    //参数2:更新的数组
    class23021.replace(0,s6);

    //遍历
    for(int i = 0;i<class23021.count();i++){
        Student s = class23021.at(i); //更高效
        qDebug()<<s.getName()<<s.getAge()<<s.getMajor();
    }
    qDebug()<<"*********************************";
    //C++ STL迭代器
    for(QList<Student>::const_iterator iter = class23021.begin();iter !=class23021.end();iter++){
        Student s = *iter;
        qDebug()<<s.getName()<<s.getAge()<<s.getMajor();
    }
    qDebug()<<"*********************************";
    //Java迭代器构造函数,参数为容器对象
    QListIterator<Student> iter(class23021);
    while(iter.hasNext()){ //判断后续有无有效元素
        //向后移动并取出
        Student s = iter.next();
        qDebug()<<s.getName()<<s.getAge()<<s.getMajor();
    }
}

Dialog::~Dialog()
{

}

main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return 0;
}

student.cpp

#include "student.h"

Student::Student(QString name,int age,QString major):name(name),age(age)
{
    this->major = major;
}
QString Student::getName() const
{
    return name;
}

void Student::setName(const QString &value)
{
    name = value;
}
int Student::getAge() const
{
    return age;
}

void Student::setAge(int value)
{
    age = value;
}
QString Student::getMajor() const
{
    return major;
}

void Student::setMajor(const QString &value)
{
    major = value;
}



运行结果:

qt ui,qt,ui,开发语言

2.2关联容器 QMap

关联容器的元素是以键值对的方式存在的,键表示数据的名称(通常使用字符串类型),值表示数据的本身(支持任何类型)。可以通过键来找到对应的值,关联容器是没有顺序的。

QMap除了支持C++的迭代器以外,还支持Java的迭代器,对应关系如下。

C++迭代器

等效的Java迭代器

QMap<T>::const_iterator

QMapIterator<T>

QMap<T>::iterator

QMutableMapIterator<T>

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include <QDebug>
#include <QMap>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    // 创建一个QMap对象
    QMap<QString,int> map;
    // 增加
    map["身高"] = 188;
    map["年龄"] = 18;
    map["防御"] = 55;
    // 插入
    // 参数1:键
    // 参数2:值
    map.insert("体重",188);

    // 删除元素
    // 参数:键
    // 返回值:删除的键值对数量,为0表示失败
    qDebug() << map.remove("体重");
    qDebug() << map.remove("体重");

    if(!map.contains("身高"))
        // 修改
        map["身高"] = 226;
    else
        qDebug() << "身高键值对已经存在,无法修改!";

    // 取出
    if(map.contains("身高"))
        qDebug() << map["身高"]; // 不存在返回0

    // 取出
    // 参数1:键
    // 参数2:如果取不到的默认值
    qDebug() << map.value("身高2",-1);

    // 支持直接输出
    qDebug() << map;

    qDebug() << "-------C++ STL 迭代器-------";

    for(QMap<QString,int>::iterator iter = map.begin();
        iter != map.end();iter++)
    {
        // 输出键值对
        qDebug() << iter.key() << iter.value();
    }

    qDebug() << "---------Java 迭代器----------";
    QMutableMapIterator<QString,int> iter(map);
    while(iter.hasNext())
    {
        iter.next(); // 单纯的向后移动迭代器指针
        // 输出键值对
        qDebug() << iter.key() << iter.value();
    }
}

Dialog::~Dialog()
{

}

qt ui,qt,ui,开发语言

 

3. Qt类型

3.1 跨平台数据类型

C++中的数据类型可能会受到不同平台的影响,导致数据长度不同。Qt为了达到跨平台特性,规定了等效的跨平台类型,可以使这些类型不受到平台的影响。

qt ui,qt,ui,开发语言

3.2 QVariant 统一数据类型 

QVariant类支持常用的Qt类型进行构造,也支持转换为这些数据类型

         构造函数                                                           to开头的成员函数

4.QDate Time 日期时间类

QDate Time类是两个类的合并:QDate和QTime,可以处理日期和时间

常用函数如下:

// 返回一个基于1970年1月1日00:00:00到现在的毫秒数(格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]
// 返回一个包含基于当前时区、当前日期和时间的QDateTime对象
QDateTime QDateTime::currentDateTime() [static]
// 返回一个制定格式的日期和时间
// 参数为日期和时间的格式,可参考文档
QString QDateTime::toString(const QString & format) const

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include <QDebug>
#include <QDateTime>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    // 计算时间戳
    qint64 time0 = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);
    qint64 time = QDateTime::currentMSecsSinceEpoch();

    qDebug() << "setupUi耗时:" << time-time0;
    qDebug() << time;
    // 把time作为种子生成随机数
    qsrand(time);
    qDebug() << "0到200的随机数:" << qrand()%201;

    // 拿到基于当前数据的QDateTime对象
    QDateTime dt = QDateTime::currentDateTime();
    // 拿到 年-月-日 时:分:秒 的格式
    QString dtText = dt.toString("yyyy年MM月dd日 hh:mm:ss");
    qDebug() << dtText;
}

Dialog::~Dialog()
{
    delete ui;
}

qt ui,qt,ui,开发语言

 5.QTimer 定时器类

QTimer类提供了一次性和周期性两周定时器模式

QTimer类的常用属性

//定时器是否在运行
active : const bool
//是否一次性
singleShot : bool
//间隔时间,单位毫秒
interval : int

常用函数如下

// 启动定时器
//如果定时器正在运行,此函数会停止运行,并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]
// 触发时发射的信号
void QTimer::timeout() [signal]

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:
    //与timeout信号连接
    void timeoutSlot();
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    //刷新时间(槽函数也是成员函数)
    timeoutSlot();


    //创建定时器对象
    timer = new QTimer(this);
    //设置间隔时间
    timer->setInterval(1000);
    //设置周期性
    timer->setSingleShot(false);
    //连接信号槽
    connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
    //启动定时器
    timer->start();
}
//到点了更新时间显示
void Dialog::timeoutSlot(){
    //拿到当前时间
    QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
    //QLcdNumber设置显示 void display(const QString & s)
    ui->lcdNumber->display(time);
}

Dialog::~Dialog()
{
    //如果定时器在运行,就停下来
    if(timer->isActive())
        timer->stop();
    delete timer;
    delete ui;
}

ui:

qt ui,qt,ui,开发语言

运行结果:

qt ui,qt,ui,开发语言文章来源地址https://www.toymoban.com/news/detail-836135.html

到了这里,关于(5)Qt—ui常用类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT开发专题-天气预报】16.更新 UI 界面

    本专栏将会在未来 4 个月内,完成以下几个 Qt 项目: 《天气预报》 《文本编辑器》 《俄罗斯方块》 《绘图板》 《网络聊天室》 《串口助手》 完成时间预计在 2022-12-31 ,文章数目在 50 篇左右,更新完毕之后,价格恢复到 ¥299 专栏优势: 每个项目都是从零新建工程开始

    2023年04月08日
    浏览(66)
  • QT QPluginLoader 插件开发 ui界面打包dll

     将项目模块化,每一个模块单独开发,模块的组成形成最终的主程序, 点击左侧按钮就会弹出对应的插件应用,每一个子窗口都是单独的dll 插件, 灵活,升级,下载,卸载。 效果:     打开QT Creator 新建插件开发项目  下一步后选择 Qt Plugin 开发 添加依赖库,在.pro里  

    2024年02月11日
    浏览(44)
  • 【Qt】使用Qt designer(Qt设计师)以及uic工具将ui文件转换到C++代码进行界面开发

    【Qt】编写第一个Qt程序,使用Cmake编译并运行 Qt Designer是一个用于创建Qt应用程序用户界面的图形化界面设计器。它是Python GUI开发的一个重要工具,可以帮助用户快速创建具有丰富功能的用户界面。 打开终端输入以下代码 点击创建 拖一些组件进来,点击保存 得到一个后缀为

    2024年02月16日
    浏览(54)
  • QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )

    项目路径为 4/01_smarthome/01_smarthome/01_smarthome.pro,先看项目界面。项目界面如 下,采用暗黑主题设计,结合黄色作为亮色,让用户一目了然。界面笔者从一些智能家居界面 中找到灵感的,编写设计完成的效果不错!请自行查阅源码,掌握了本教程前面第七章的内容, 就可以理

    2024年02月16日
    浏览(50)
  • QGIS开发五:VS使用QT插件创建UI界面

    前面我们说了在创建项目时创建的是一个空项目,即不使用 Qt 提供的综合开发套件 Qt Creator,也不使用 Qt Visual Studio Tools 这类工具。 但是后面发现,如果我想要有更加满意的界面布局,还是要自己写一个UI文件,如果不使用QT插件,在VS中导入自己的UI文件编译起来不是那么容

    2024年02月13日
    浏览(59)
  • QT支持多种开发语言

    QT主要是一个C++应用程序框架,但它也提供了对其他一些编程语言的官方或非官方支持。以下是QT支持的一些语言版本及其特点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Python (PyQt)  : PyQt是QT的官方Python绑定,允许Python开发者使用QT库来创建

    2024年04月29日
    浏览(49)
  • QGIS二次开发六:VS不借助QT插件创建UI界面

    上一篇博客我们说了在VS中如何使用QT插件来创建UI界面,但是我们二次开发QGIS的第一篇博客就说了,最好使用OSGeo4W中自动下载的QT进行QGIS二次开发,这样兼容性是最好的,那么该如何在VS中不使用外部安装的QT以及QT的VS插件情况下进行UI界面的创建和使用呢? 如果你仔细看完

    2024年02月13日
    浏览(39)
  • 12-2_Qt 5.9 C++开发指南_自定义Qt Designer 插件(UI 设计器自定义界面组件的 Widget 插件,直接安装到 UI设计器组件面板里,如同 Qt 自带的界面设计组件一样)

    上篇使用提升法(promotion)来创建自定义组件,本篇为 UI 设计器设计自定义界面组件的 Widget 插件,直接安装到 UI设计器的组件面板里,如同 Qt 自带的界面设计组件一样使用,在设计时就能看到组件的实际显示效果,只是编译和运行时需要使用到插件的动态链接库 (Windows 平台上

    2024年02月05日
    浏览(56)
  • 【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标:干掉它。 战术路线:Qt 绘图可以使用 Qt Charts,先了解

    2024年02月11日
    浏览(52)
  • vs+qt开发中,报错找不到ui_QtWidgetsApplication1.h文件

    添加包含目录和库目录以后如果还是不行,我自己发现了把Qt project Settings里show in build log改成是就好了。 但是这样以后每次修改ui的时候需要打开属性把Qt project Settings里show in build log改成否然后应用一下再改成是,你添加的控件又可以识别到了。

    2024年01月18日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包