QT基础篇1

Posted 1532387167llx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT基础篇1相关的知识,希望对你有一定的参考价值。

 1、计算圆的面积

运行效果:

技术图片

 实现过程(两种方式):

(1)QPushButton转到槽;

(2)QLineEdit转到槽命令,“textChanged(QString)”信号;

代码部分:

由于太过简单就不粘贴代码了

2、具有复选框的树形控件(QTreeWidget)

运行效果:

当选中顶层树形节点时,子节点全部被选中;当取消选择顶层树形节点时,子节点的选中状态将全部取消;当选中子节点时,父节点显示部分选中的状态。

技术图片

实现过程:

 (1)初始化两组(QTreeWidgetItem类):group1 group2,每组加入各个子节点

设置每个节点(包括子节点与父节点)的标志和属性(setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable)与setCheckState(0,Qt::Unchecked));

(2)连接信号与槽

当节点值改变时的槽函数(void TreeWidget::treeItemChanged(QTreeWidgetItem *item)),

①判断该节点有无选中;

②选中时,判断该节点有无子节点。若有子节点,则表明该选中的节点是父节点,则其子节点全部选中。若没有子节点则去判断其父节点的情况(转④)。

③没有选中时,判断该节点有无子节点。若有子节点,则其子节点全部不选中。若没有子节点则判断父节点的情况(转④)。

④判断父节点:当父节点不为空时,计算该父节点有多少个子节点被选中。若选中的子节点个数为0,则父节点不选中;若选中的子节点个数介于0到总的子节点个数之间,则父节点为部分选择状态;若选中的子节点个数等于总的子节点个数,则父节点为选中状态。

代码部分

(1)初始化函数

技术图片
 1 void TreeWidget::init()
 2 
 3     //ui->treeWidget->clear();
 4     QTreeWidgetItem *group1=new QTreeWidgetItem(ui->treeWidget);
 5     //设置每个的标志和属性
 6     group1->setText(0,"group1");
 7     group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 8     group1->setCheckState(0,Qt::Unchecked);
 9     QTreeWidgetItem *subItem11=new QTreeWidgetItem(group1);
10     subItem11->setText(0,"subItem11");
11     subItem11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
12     subItem11->setCheckState(0,Qt::Unchecked);
13     QTreeWidgetItem *subItem12=new QTreeWidgetItem(group1);
14     subItem12->setText(0,"subItem12");
15     subItem12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
16     subItem12->setCheckState(0,Qt::Unchecked);
17     QTreeWidgetItem *subItem13=new QTreeWidgetItem(group1);
18     subItem13->setText(0,"subItem13");
19     subItem13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
20     subItem13->setCheckState(0,Qt::Unchecked);
21     QTreeWidgetItem *subItem14=new QTreeWidgetItem(group1);
22     subItem14->setText(0,"subItem14");
23     subItem14->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
24     subItem14->setCheckState(0,Qt::Unchecked);
25     
26     QTreeWidgetItem *group2=new QTreeWidgetItem(ui->treeWidget);
27     group2->setText(0,"group2");
28     group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
29     group2->setCheckState(0,Qt::Unchecked);
30     QTreeWidgetItem *subItem21=new QTreeWidgetItem(group2);
31     subItem21->setText(0,"subItem21");
32     subItem21->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
33     subItem21->setCheckState(0,Qt::Unchecked);
34     QTreeWidgetItem *subItem22=new QTreeWidgetItem(group2);
35     subItem22->setText(0,"subItem22");
36     subItem22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
37     subItem22->setCheckState(0,Qt::Unchecked);
38     QTreeWidgetItem *subItem23=new QTreeWidgetItem(group2);
39     subItem23->setText(0,"subItem23");
40     subItem23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
41     subItem23->setCheckState(0,Qt::Unchecked);
42 
View Code

(2)槽函数

技术图片
QString itemText=item->text(0);
    if(Qt::Checked==item->checkState(0))
    
        QTreeWidgetItem *parent=item->parent();
        int count=item->childCount();
        if(count>0)
        
            for(int i=0;i<count;i++)
            
                item->child(i)->setCheckState(0,Qt::Checked);
            
        
        else
        
            updateParentItem(item);
        
    
    else if(Qt::Unchecked==item->checkState(0))
    
        QTreeWidgetItem *parent=item->parent();
        int count=item->childCount();
        if(count>0)
        
            for(int i=0;i<count;i++)
            
                item->child(i)->setCheckState(0,Qt::Unchecked);
            
        
        else
        
            updateParentItem(item);
        
    
判断父节点
QTreeWidgetItem *parent=item->parent();
    if(parent==NULL)
    
        return;
    
    int selectedItem=0;
    int childCount=parent->childCount();
    for(int i=0;i<childCount;i++)
    
        QTreeWidgetItem *childItem=parent->child(i);
        if(childItem->checkState(0)==Qt::Checked)
        
            selectedItem++;
        
    
    if(selectedItem<=0)
    
        parent->setCheckState(0,Qt::Unchecked);
    
    else if(selectedItem>0&&selectedItem<childCount)
    
        parent->setCheckState(0,Qt::PartiallyChecked);
    
    else if(selectedItem==childCount)
    
        parent->setCheckState(0,Qt::Checked);
    
    
View Code

 3、容器类(常用的三种:QList、QLinkedList、QVector类)

3.1 QList

 QList<T>存储给定数据类型T的一系列数值,

追加函数:QList::append(),QList::prepared(),QList::insert();

访问方式:基于下标的快速访问

只读迭代器代码1(向后遍历):

技术图片
1 QList<int> list;
2     list<<1<<2<<3<<4<<5;
3     /***以该list为参数初始化一个QListIterator对象i,此时迭代点处在第一个列表项“1”的前面***/
4     QListIterator<int> i(list);
5     for(;i.hasNext();)
6     
7         qDebug()<<i.next();
8     
View Code

next()函数使得迭代点位于第一个列表项和第二个列表项之间,并返回它跳过的列表项的内容。运行结果为1 2 3 4 5.

只读迭代器代码2(向前遍历)

技术图片
 1 QList<int> list;
 2     list<<1<<2<<3<<4<<5;
 3     QListIterator<int> i(list);
 4     /***将迭代点移动到最后一个列表项的后面***/
 5     i.toBack();
 6     /***检查当前迭代点之前是否具有列表项***/
 7     for(;i.hasPrevious();)
 8     
 9         /***返回前一个列表项的内容并将迭代点移动到前一个列表项之前***/
10         qDebug()<<i.previous();
11     
View Code

运行结果为:5 4 3 2 1

除上述提及的函数以外,QListIterator<T>提供的其它函数有如下几种。

toFront():移动迭代点到列表的前端(第一个列表项的前面)。

peekNext():返回下一个列表项,但不移动迭代点。

peekPrevious():返回前一个列表项,但不移动迭代点。

findNext():从当前迭代点开始向后查找指定的列表项,如果找到,则返回true,此时迭代点位于匹配列表项的后面;如果没有找到,则返回false,此时迭代点位于列表的后端(最后一个列表项的后面)。

findPrevious():与findNext()类似,不同的是它的方向是向前的,查找操作完成后的迭代点在匹配项的前面或者整个列表的前端。

读写迭代器代码:

技术图片
 1 QList<int> list;
 2     QMutableListIterator<int> i(list);
 3     for(int j=0;j<10;j++)
 4     
 5         i.insert(j);
 6     
 7     for(i.toFront();i.hasNext();)
 8     
 9         qDebug()<<i.next();
10     
11     for(i.toBack();i.hasPrevious();)
12     
13         if(i.previous()%2==0)
14         
15             i.remove();
16         
17         else
18         
19             i.setValue(i.peekNext()*10);
20         
21     
22     for(i.toFront();i.hasNext();)
23     
24         qDebug()<<i.next();
25     
View Code

运行结果:0 1 2 3 4 5 6 7 8 9

                  10 30 50 70 90

3.2 QLinkedList

 QLinkedList<T>链式列表,以非连续的内存块保存数据

访问方式:只能使用迭代器访问它的数据项

3.3 QVector

QVector<T>在相邻的内存中存储给定数据类型T的一组数值

访问方式:既可以进行基于下标的访问方式,又可以使用迭代器访问

3.4 两类风格(JAVA与STL)迭代器数据类型的两种分类

(1)JAVA

容器类 只读迭代器类 读写迭代器类
 QList<T>,QQueue<T> QListIterator<T>  QMultableListIterator<T> 
QLinkedList<T>  QLinkedIterator<T>  QMultableLinkedListIterator<T> 
Qvector<T> ,QStack<T> QVectorIterator<T>   QMultableVectorIterator<T>

 java风格迭代器的迭代点位于列表项的中间,而不是直接指向某个列表项。因此,它的迭代点或者在第一个列表项的前面,或者在两个列表项之间,或者在最后一个列表项之后。

(2)STL风格

容器类 只读迭代器类 读写迭代器类
QList<T>,QQueue<T> QList<T>::const_iterator QList<T>::iterator
QLinkedList<T> QLinkedList<T>::const_iterator QLinkedList<T>::iterator
QVector<T>,QStack<T> QVector<T>::const_iterator QVector<T>::iterator

STL风格迭代器举例:

代码:

技术图片
 1 QList<int> list;
 2     for(int j=0;j<10;j++)
 3     
 4         list.insert(list.end(),j);
 5     
 6     /***读写迭代器***/
 7     QList<int>::iterator i;
 8     for(i=list.begin();i!=list.end();++i)
 9     
10         qDebug()<<(*i);
11         *i=(*i)*10;
12     
13     /***只读迭代器***/
14     QList<int>::const_iterator ci;
15     for(ci=list.constBegin();ci!=list.constEnd();++ci)
16     
17         qDebug()<<(*ci);
18     
View Code

运行结果:0 1 2 3 4 5 6 7 8 9

                 0 10 20 30 40 50 60 70 80 90

4.键值映射类(QMap、QHash类)

4.1 QMap类

QMap<Key,T>提供一个从类型为Key的键到类型为T的值的映射,支持一键一值与一键多值

4.2 QHash类

4.3 两类风格迭代器遍历

JAVA风格迭代器

容器类 只读迭代器类 读写迭代器类
QMap<Key,T>,QMultiMap<Key,T> QMapIterator<Key,T> QMultableMapIterator<Key,T>
QHash<Key,T>,QMultiHash<Key,T> QHashIterator<Key,T> QMultableHashIterator<Key,T>

代码:

技术图片
 1 QMap<QString,QString> map;
 2     map.insert("beijing","111");
 3     map.insert("shanghai","021");
 4     map.insert("nanjing","025");
 5     /***创建一个只读迭代器***/
 6     QMapIterator<QString,QString> i(map);
 7     for(;i.hasNext();)
 8     
 9         qDebug()<<" "<<i.key()<<i.next().value();
10     
11     /***创建一个读写迭代器***/
12     QMutableMapIterator<QString,QString> mi(map);
13     if(mi.findNext("111"))
14     
15         mi.setValue("010");
16     
17     QMapIterator<QString,QString> modi(map);
18     qDebug()<<" ";
19     for(;modi.hasNext();)
20     
21         qDebug()<<" "<<modi.key()<<modi.next().value();
22     
View Code

技术图片

STL风格迭代器

容器类 只读迭代器类 读写迭代器类
QMap<Key,T>,QMultiMap<Key,T> QMap<Key,T>::const_iterator QMap<Key,T>::iterator
QHash<Key,T>,QMultiHash<Key,T> QHash<Key,T>::const_iterator QHash<Key,T>::iterator

代码:

技术图片
 1  QMap<QString,QString> map;
 2     map.insert("beijing","111");
 3     map.insert("shanghai","021");
 4     map.insert("jinan","0531");
 5     /***创建一个只读迭代器***/
 6     QMap<QString,QString>::const_iterator i;
 7     for(i=map.constBegin();i!=map.constEnd();++i)
 8     
 9         qDebug()<<" "<<i.key()<<i.value();
10     
11     /***创建一个读写迭代器***/
12     QMap<QString,QString>::iterator mi;
13     mi=map.find("beijing");
14     if(mi!=map.end())
15     
16         mi.value()="010";
17     
18     QMap<QString,QString>::const_iterator modi;
19     qDebug()<<" ";
20     for(modi=map.constBegin();modi!=map.constEnd();++modi)
21     
22         qDebug()<<" "<<modi.key()<<modi.value();
23     
View Code

运行结果:

技术图片

5、QVariant类

包含很多的数据类型。

代码:

技术图片
 1 QVariant a(709);
 2     qDebug()<<a.toInt();
 3     QVariant b("How are you!");
 4     qDebug()<<b.toString();
 5     QMap<QString,QVariant>map1;
 6     map1["int"]=709;
 7     map1["double"]=709.709;
 8     map1["string"]="How are you!";
 9     map1["color"]=QColor(255,0,0);
10     qDebug()<<map1["int"]<<map1["int"].toInt();
11     qDebug()<<map1["double"]<<map1["double"].toDouble();
12     qDebug()<<map1["string"]<<map1["string"].toString();
13     qDebug()<<map1["color"]<<map1["color"].value<QColor>();
14     QStringList sl1;
15     sl1<<"A"<<"B"<<"C"<<"D";
16     QVariant sl2(sl1);
17     if(sl2.type()==QVariant::StringList)
18     
19         QStringList sl3=sl2.toStringList();
20         for(int i=0;i<sl3.size();++i)
21             qDebug()<<sl3.at(i);
22     
View Code

运行结果:

技术图片

6、正则表达式(QRegExp类)

组成部分:表达式、量词、断言。如[A-Z a-z_]+[A-Z a-z_0-9]*,"+"表示[A-Z a-z_]至少出现一次;"*"表示[A-Z a-z_0-9]可以出现零次或多次。

代码:

技术图片
1 QRegExp regExp("[A-Za-z][1-9][0-9]0,2");
2     ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));
3     connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept()));
4     connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
5 void Dialog::on_lineEdit_textChanged()
6 
7      ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());
8 
View Code

运行结果:

没输入之前ok按钮是灰色,

技术图片

输入之后

技术图片

 

以上是关于QT基础篇1的主要内容,如果未能解决你的问题,请参考以下文章

Qt快速入门学习笔记(基础篇)

Python Qt GUI设计:窗口布局管理方法强化篇(基础篇—6)

Python Qt GUI设计:QCalendar日历类和QDateTimeEdit时间类(基础篇—20)

Python Qt GUI设计:QMainWindowQWidget和QDialog窗口类(基础篇—10)

Qt入门之基础篇 ( 二 ) :Qt项目建立编译运行和发布过程解析

Python Qt GUI设计:UI界面可视化组件属性概述(基础篇—3)