• 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按钮是灰色,

    输入之后

    When you are obsessed something,anything can be easy and possible.
  • 相关阅读:
    结婚电子
    ASP.NET 5简介
    定位500错误!
    Web项目
    JS编程
    CQRS 示例
    领域驱动设计的面向服务架构
    Oracle免费的便捷Web应用开发框架
    ThreadLocal是否会引发内存泄露的分析 good
    应用的代码没有用新的类库来进行编译(转)
  • 原文地址:https://www.cnblogs.com/1532387167llx/p/11161219.html
Copyright © 2020-2023  润新知