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 }
(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); }
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 }
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 }
运行结果为: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 }
运行结果: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 }
运行结果: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 }
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 }
运行结果:
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 }
运行结果:
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 }
运行结果:
没输入之前ok按钮是灰色,
输入之后