Qt编程基础(信号和槽机制、字符串操作、容器类)

2 篇文章 0 订阅

一、信号和槽

1.一个信号可以与另一个信号相连,如:

connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object1, SIGNAL(object1Signal2(int, int,char)));//同一个对象里的不同信号
connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object2, SIGNAL(object1Signal3(int, int,char)));//不同对象里的不同信号

2.同一个信号可以与多个槽相连

connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object1, SLOT(object1Slot(int, int,char)));//同一对象里的槽函数
connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object2, SLOT(object2Slot(int, int,char)));//不同对象里的槽函数

3.同一个槽可以与多个信号相连

connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object1, SLOT(object1Slot(int, int,char)));//同一对象里的信号
connect(object2, SIGNAL(object2Signal1(int, int,char)),
        object1, SLOT(object1Slot(int, int,char)));//不同对象里的信号

4.信号的参数个数一定多于或者等于槽函数的参数个数,槽函数的所有参数类型必须与信号的参数类型对应

connect(object1, SIGNAL(object1Signal1(int, int,char)),
        object1, SLOT(object1Slot(int, int,char,int)));
        //槽函数object1Slot的前三个参数类型和信号object1Signal1相同

5.对于自定义的类型、结构体等想要作为信号传递给槽函数,必须用qRegisterMetaType()函数注册类型

struct user_info {
    QString name;
    int age;
};
qRegisterMetaType<struct user_info >("user_info ");  
//对于自定义结构体要先注册才能在信号和槽中被当成参数正确传递
connect(object1, SIGNAL(object1Signal(struct user_info)), 
this, SLOT(object2Slot(struct user_info)));

二、字符串操作

    QString string1 = "hello";
    QString string2 = "world";
    //常用字符串拼接四种方法
    QString string = string1 +" " + string2;
    qDebug()<<"+:"<<string;

    string1.append(" ");
    string1.append(string2);
    qDebug()<<"append:"<<string1;

    string1 = "hello ";
    string2 = "world";
    string.sprintf("%s %s",string1.toLatin1().data(), string2.toLatin1().data());
    qDebug()<<"sprintf:"<<string;

    string = QString("%1 this is %2").arg(string1).arg(string2);
    qDebug()<<"arg:"<<string;

    //常用字符串分割
    string1 = "one,tow,three";
    string2 = "/usr/local/bin"; 
    //SectionSkipEmpty将空字段视为不存在,即在开始和结束时不考虑它们。
    QString::SectionFlag flag = QString::SectionSkipEmpty;//

    string = string1.section(',', 1, 1);   // str == "tow"
    qDebug()<<"1:"<<string;
    string = string2.section('/', -2, -2, flag); // str == "local"
    qDebug()<<"2:"<<string;


三、容器使用

QList、QLinkList、QVector三种容器类的时间复杂度比较:

1.QList <T>

QList容器提供了追加、插入、删除、替代等方法。对于不同的数据类型:

(1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList会将数值直接存储在它的数组中

(2)如果QList <T>存储对象的指针,则该指针指向实际存储的对象

    QList<int> list;
    int i = 0;
    for(i = 0; i < 10; i++) {
        list.append(i);                 //相当于list.insert(size(), i),在列表末尾增加数据
    }
    qDebug()<<"size ="<<list.size();    //输出列表大小
    for(i = 0; i < 10; i++) {
        qDebug()<<"i ="<<list.at(i);    //输出在i位置的列表的值
    }
    qDebug()<<"inset/replace/delet";
    list.insert(5,100);                 //插入数据,若非往列表末尾插入数据则不改变列表大小,该位置的元素往后移,最末尾的丢弃
    list.replace(6,101);                //替换
    list.removeAt(9);                   //删除
    for(i = 0; i < 10; i++) {
        qDebug()<<"i ="<<list.at(i);
    }

    list.clear();                       //清空列表
    qDebug()<<"size ="<<list.size();
    if(list.isEmpty())                  //判断列表是否为空
        qDebug()<<"list is empty";

2.QLinkList<T>

和QList在用法上不同的是,QLinkList<T>是一个链式列表,它以非连续的内存块保存数据。并且QLinkList<T>不能使用下标,只能使用迭代器访问它的数据项。关于QLinkedList的使用请参考:

用QLinkedList写链表(创建、显示、插入、删除)以及出现相关错误

举个简单例子:

    int i; 
    QLinkedList<int> linkedList;
    for(i = 0; i < 10; i++) {
        linkedList.append(i);
    }
    qDebug()<<"size ="<<linkedList.size();
    QLinkedList<int>::iterator it;
    for(it = linkedList.begin(); it != linkedList.end(); it++)
        qDebug()<<"it ="<<*it;

3.QVector <T>

对于QVector,QVector <T>在相邻的内存中存储给定数据类型T的一组数值。QVector即可以使用下标访问数据项,也可以使用迭代器访问数据项。当使用下标访问数据项时,用法与QList大同小异,使用迭代器访问数据项时,用法与QLinkedList大同小异。

    int i;
    QVector <int> vector;
    for(i = 0; i < 10; i++) {
        vector.append(i);
    }
    qDebug()<<"size ="<<vector.size();
    for(i = 0; i < 10; i++) {
        qDebug()<<"i ="<<vector.at(i);
    }
    qDebug()<<"inset/replace/delet";
    vector.insert(5,100);
    vector.replace(6,101);
    vector.removeAt(9);
    vector.push_back(120);         //在尾部增加
    vector.push_front(110);        //在头部添加,QList也有这个方法
    for(i = 0; i < 12; i++) {
        qDebug()<<"i ="<<vector.at(i);
    }
    qDebug()<<"pop";
    vector.pop_back();            //删除尾部元素
    vector.pop_front();           //删除头部元素
    for(i = 0; i < 10; i++) {    
        qDebug()<<"i ="<<vector.at(i);
    }


    vector.clear();
    qDebug()<<"size ="<<vector.size();
    if(vector.isEmpty())
        qDebug()<<"list is empty";

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值