第二章 Qt模板库、工具类及控件

目录

2.1字符串类

2.1.1字符串的一般操作

1.字符串拼接

2.字符串查询

3.字符串截取

4.字符串存储相关函数

5.字符串转换和修改

2.1.2字符串与数值的转换

1.字符串转换为整数

2.字符串转换为浮点型

3.函数 setNum()

4.函数 arg()

2.2容器类

2.3控件

例子:创建具有复选框的树形控件。

参考:


2.1字符串类

         QString 是 Qt 中的一个类,用于存储字符串,QString 没有父类。QString 存储的是一串字符,每个字符是一个 QChar 类型的数据。

         QString 类定义了大量的接口函数用于字符串操作。QString在 Qt 类库中应用非常广泛,很多函数的参数是 QString 类型。QString 使用隐式共享减少内存占用,也就是只有在修改一个字符串的时候,这个字符串才会被复制。

2.1.1字符串的一般操作

1.字符串拼接

使用加号运算符可以直接将两个 QString 字符串拼接为一个字符串。

QString str1 = "你是",str2 = "谁?";
QString str3 = str1 + str2; //你是谁?
QString str4 = str2 + str1; //谁?你是

addend()函数实现在一个字符串末尾追加另一个字符串,

prepend()函数在原字符串的开头插入另一个字符串,

insert()函数在原字符串特定的位置插入另一个字符串。

    QString str1 = "猜猜";
    QString str2 = "我是谁";
    QString str3 = "Hello ";

    str1.append(str2);
    str1.append("__皮卡丘。");
    str1.prepend(str3);
    qDebug()<
//运行结果
"Hello 猜猜我是谁__皮卡丘。"
"Hello 猜猜我是谁__I am皮卡丘。"

2.字符串查询

QString::startsWith()函数判断一个字符串是否以某个字符串开头。

QString::endsWith()函数判断一个字符串是否以某个字符串结尾。

QString::contains()函数判断一个指定的字符串是否出现过。

    bool ret;
    QString str = "Welcome to you!";
    ret = str.startsWith("Welcome",Qt::CaseSensitive);//返回true
    qDebug()<

indexOf()的功能是在当前字符串内查找某个字符串首次出现的位置。

lastIndexOf()的功能则是在当前字符串内查找某个字符串最后出现的位置。

带参数的count()统计当前字符串中某个字符串出现的次数。

    QString stra3 = "qt,Qt,Qt,qt,qt";
    int N = stra3.count("qt");//默认区分大小写
    qDebug()<

3.字符串截取

(1)        函数 front() back()。函数 front()返回字符串中的第一个字符,相当于 at(0);函数 back() 返回字符串中的最后一个字符。

QString str = "Hi,吃了吗";
QChar ch1 = str.front();//ch1 = 'H'
QChar ch2 = str.back();//ch2 = '吗'

(2)        函数 left()right()。函数 left()从字符串中提取左边 n 个字符,函数 right()从字符串中提取右边 n 个字符,n 为设定参数。

    QString str4 = "It's been quite a journey this year, "
                   "full of surprises and unexpected events. "
                   "Let's leave the past behind and move on.";
    QString str5 = str4.left(3);
    qDebug()<

(3)        函数 mid()。函数 mid()用于返回字符串中的部分字符串,其函数原型定义如下:

QString QString::mid(qsizetype pos, qsizetype n = -1)

pos 是起始位置,n 是返回字符串中的字符个数。如果不指定参数 n,就返回从 pos 开始到 末尾的字符串,如果 pos+n 超过了字符串的边界,返回的字符串就为 null。

    QString str6 = "E://Qt5_deve_exam//test";
    int N = str6.lastIndexOf("//");  //获取最后一个"//"出现的位置
    QString str61 = str6.mid(N);
    qDebug()<

(4)        函数 section()。函数 section()的原型定义如下:

QString QString::section(const QString &sep, qsizetype start, qsizetype end = -1, 
                                         QString::SectionFlags flags = SectionDefault) 

其功能是从字符串中提取以 sep 作为分隔符,从 start 段到 end 段的字符串,例如:

    QString str71,str7 = "既然你诚心诚意的发问了,我们就大发慈悲的告诉你!为了防止世界被破坏,"
                   "为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色。";
    str71 = str7.section(",",0,0);
    qDebug()<

4.字符串存储相关函数

(1)        isEmpty()isNull()。这两个函数都会判断字符串是否为空,但是稍有差别。如果是一个空字符串,也就是只有“\0”,则 isNull()返回 false,而 isEmpty()返回 true。只有未被赋值时, isNull()才返回 true。

    QString str81,str8 = ""; 
    bool b = true;
    b = str81.isEmpty();//b = true
    b = str81.isNull();//b = true
    b = str8.isEmpty();//b = true
    b = str8.isEmpty();//b = false

        一个NULL字符串一定是一个空字符串,一个空字符串未必是一个NULL字符串。

(2)         count()size()length()。函数 size()和 length()都返回字符串中的字符个数,它们的功能相同。不带有任何参数的函数 count()与这两个函数功能相同,此外,count()还有带参数的形式,可统计某个字符串在当前字符串中出现的次数。

    QString str9 = "你好";
    QString str10 = "Hello";
    int N = str9.count();
    qDebug()<

(3)        函数 clear()清空当前字符串,使字符串为 null。

    QString stra1 = "";
    bool b = stra1.isNull();//b = false,字符串以被赋值,不为NULL
    b = stra1.isEmpty();//b = true
    stra1.clear();
    b = stra1.isNull();//b = true ,clear清空了字符串,为NULL

(4)        函数 resize()改变字符串长度。

(5)        函数 fill() 将字符串中的每个字符都用一个新字符替换,且可以改变字符串长度。

    QString stra2 = "hello";
    stra2.fill('x');
    qDebug()<

5.字符串转换和修改

(1)        函数 toUpper()将字符串内的字母全部转换为大写字母, toLower()将字符串内的字母全部转换为小写字母。

(2)        函数 trimmed()会去掉字符串首尾的空格,函数 simplified() 不仅会去掉字符串首尾的空格,还会将中间连续的空格用单个空格替换。

    QString strb1 = "  I'am    ok ";
    qDebug()<

(3)        函数 chop()去掉字符串末尾的 n 个字符, n 是输入参数。如果 n大于或等于字符串实际长度, 字符串内容就变为空。

2.1.2字符串与数值的转换

1.字符串转换为整数

int toInt(bool *ok = nullptr, int base = 10) 
uint toUInt(bool *ok = nullptr, int base = 10) 
long toLong(bool *ok = nullptr, int base = 10) 
ulong toULong(bool *ok = nullptr, int base = 10) 
short toShort(bool *ok = nullptr, int base = 10) 
ushort toUShort(bool *ok = nullptr, int base = 10) 
qlonglong toLongLong(bool *ok = nullptr, int base = 10) 
qulonglong toULongLong(bool *ok = nullptr, int base = 10) 

        这几个函数的输入参数都一样。变量 ok 如果不为 null, 就作为转换结果是否成功的返回变量,  false 表示转换失败, true 表示转换成功。变量 base 表示使用的进制, 默认值为 10, 也就是十进制。base 可以设置为 2~36,常用的是二进制、八进制、十六进制; base 还可以设置为 0,表示使用 C 语言的表示法,字符串以“0x”开头就是十六进制的,否则就是十进制的。

2.字符串转换为浮点型

float toFloat(bool *ok = nullptr) 
double toDouble(bool *ok = nullptr) 

3.函数 setNum()

        用于将整数或浮点数转换为字符串。

4.函数 arg()

        函数 arg()用于格式化输出各种数据的字符串, 使用起来更灵活。

    int age = 20;
    QString book = "Qt";
    QString str = QString("我今年%1岁,喜欢读%2的书。").arg(age).arg(book);
    qDebug()<

2.2容器类

        省

2.3控件

例子:创建具有复选框的树形控件。

运行结果如下:

第二章 Qt模板库、工具类及控件_第1张图片

widget.h文件:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
public:
    void init();    //初始化
    void updataPatentItem(QTreeWidgetItem* item);//更新父类条款
public slots:
    void treeItemChanged(QTreeWidgetItem* item, int column);//树控件条款改变的槽函数

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    init();//先初始化
    //ui界面的treeWidget部件发送条款改变的信号,窗口接受信号并运行函数treeItemChanged(QTreeWidgetItem*,int)
    connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),
            this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));

}

Widget::~Widget()
{
    delete ui;
}
/* 初始化 */
void Widget::init()
{
    ui->treeWidget->clear();//通过删除树形小部件的所有项和选择来清除其小部件。
    
    //第一组

    // ui设计里Tree Widget 的ObjectName是treeWidget
    /*  
        创建parent
        第一步:创建一个新的QTreeWidgetItem部件group1,放在ui->treeWidget里
        第二步:设置group1的文本是“group1”
        第三步:设置group1的标志:用户可以选中或取消选中|它可以被编辑|可以选择
        第四步:将给定列检查状态中的项设置为未选中状态。
    */
    QTreeWidgetItem * group1 = new QTreeWidgetItem(ui->treeWidget);
    group1->setText(0,"group1");
    group1->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    group1->setCheckState(0,Qt::Unchecked);
    /*  
        创建child
        第一步:创建一个新的QTreeWidgetItem部件subItem11,放在group1里
        第二步:设置subItem11的文本是“subItem11”
        第三步:设置subItem11的标志:用户可以选中或取消选中|它可以被编辑|可以选择
        第四步:将给定列检查状态中的项设置为未选中状态。
    */
    QTreeWidgetItem * subItem11 = new QTreeWidgetItem(group1);
    subItem11->setText(0,"subItem11");
    subItem11->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem11->setCheckState(0,Qt::Unchecked);
    QTreeWidgetItem * subItem12  = new QTreeWidgetItem(group1);
    subItem12->setText(0,"subItem12");
    subItem12->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem12->setCheckState(0,Qt::Unchecked);
    //第二组
    QTreeWidgetItem * group2 = new QTreeWidgetItem(ui->treeWidget);
    group2->setText(0,"group2");
    group2->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    group2->setCheckState(0,Qt::Unchecked);
    QTreeWidgetItem * subItem21 = new QTreeWidgetItem(group2);
    subItem21->setText(0,"subItem21");
    subItem21->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem21->setCheckState(0, Qt::Unchecked);
    QTreeWidgetItem * subItem22 = new QTreeWidgetItem(group2);
    subItem22->setText(0,"subItem22");
    subItem22->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem22->setCheckState(0, Qt::Unchecked);
    QTreeWidgetItem * subItem23 = new QTreeWidgetItem(group2);
    subItem23->setText(0,"subItem23");
    subItem23->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem23->setCheckState(0, Qt::Unchecked);


}

/* 更新父项 */
void Widget::updataPatentItem(QTreeWidgetItem *item)
{
    QTreeWidgetItem * parent = item->parent();//定义一个QTreeWidgetItem对象parent 作为 该项目的父项
    if(parent == NULL){//如果parent 空 则返回
        return;
    }
    int selectedCount = 0;//子项选中的数量
    int childCount = parent->childCount();//子项的总数量
    for(int i = 0; ichild(i);//定义一个QTreeWidgetItem对象childItem 作为 
                                                       //父项的第i个子项
        if(childItem->checkState(0) == Qt::Checked){//如果子项的状态是选中的
            selectedCount++;//子项选中的数量 + 1
        }
    }
    if(selectedCount <= 0){
        //未选中
        parent->setCheckState(0,Qt::Unchecked);
    }else if(selectedCount > 0 && selectedCount < childCount){
        //部分选中
        parent->setCheckState(0,Qt::PartiallyChecked);
    }else if(selectedCount == childCount){
        //全选中
        parent->setCheckState(0, Qt::Checked);
    }
}
/* 树项目改变 */
void Widget::treeItemChanged(QTreeWidgetItem *item, int column)
{
    QString itemText = item->text(0);//定义一个QString对象itemText 作为 项目指定列中的文本。

    //group1 or 2选中时
    if(Qt::Checked == item->checkState(0)){
        QTreeWidgetItem * parent = item->parent();//定义一个QTreeWidgetItem对象parent 作为 该项目的父项
        int count = item->childCount();//子项的总数量
        if(count > 0){
            for(int i = 0 ; ichild(i)->setCheckState(0,Qt::Checked);
            }
        }else{
            updataPatentItem(item);
        }
    }else if(Qt::Unchecked == item->checkState(0)){//group1 or 2未选中
        int count = item->childCount();
        if(count > 0){
            for(int i = 0; ichild(i)->setCheckState(0,Qt::Unchecked);
            }
        }else{
            updataPatentItem(item);
        }
    }
}

参考:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pxxzhk/article/details/133591597
 

你可能感兴趣的:(Qt5开发及实例,qt,开发语言)