• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhonghua

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks
            今天簡單說一下Qt的樹形控件,在Qt中樹形控件的名稱叫做QTreeWidget,而控件里的樹節(jié)點(diǎn)的名稱叫做QTreeWidgetItem。今天這 里講的是如何創(chuàng)建具有復(fù)選框的樹形控件,這種控件其實(shí)有時(shí)挺有用的,如飛信群發(fā)短信時(shí)的選擇聯(lián)系人的界面中就使用了有復(fù)選框的樹形控件。先來看一下長什么 樣的:

            當(dāng)選中頂層的樹形節(jié)點(diǎn)時(shí),子節(jié)點(diǎn)全部被選中,當(dāng)取消頂層樹形節(jié)點(diǎn)時(shí),子節(jié)點(diǎn)全部被取消選中狀態(tài),而當(dāng)選中子節(jié)點(diǎn)時(shí),父節(jié)點(diǎn)顯示部分選中的狀態(tài)。

                  要實(shí)現(xiàn)這種界面其實(shí)很簡單的。在Qt的設(shè)計(jì)器中,拖出一個(gè)QTreeWidget,然后在主窗口中寫一個(gè)函數(shù)init初始化界面,連接樹形控件的節(jié)點(diǎn)改變 信號(hào)itemChanged(QTreeWidgetItem* item, int column),實(shí)現(xiàn)這個(gè)信號(hào)的即可。下面是具體代碼:

                  ui.setupUi(this);

                   //初始化
                    init();

                 //連接信號(hào)和槽

                  connect(ui.treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeItemChanged(QTreeWidgetItem*, int)));

            void TreeWidgetTest::init()
            {
                ui.treeWidget->clear();

               //第一個(gè)分組
               QTreeWidgetItem *group1 = new QTreeWidgetItem(ui.treeWidget);
               group1->setText(0, "group1");
               group1->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
               group1->setCheckState(0, Qt::Unchecked);

               QTreeWidgetItem *subItem11 = new QTreeWidgetItem(group1);
               subItem11->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
               subItem11->setText(0, "subItem11");
               subItem11->setCheckState(0, Qt::Unchecked);

               QTreeWidgetItem *subItem12 = new QTreeWidgetItem(group1);
               subItem12->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
               subItem12->setText(0, "subItem12");
               subItem12->setCheckState(0, Qt::Unchecked);

              QTreeWidgetItem *subItem13 = new QTreeWidgetItem(group1);
              subItem13->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
              subItem13->setText(0, "subItem13");
              subItem13->setCheckState(0, Qt::Unchecked);

              QTreeWidgetItem *subItem14 = new QTreeWidgetItem(group1);
              subItem14->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
              subItem14->setText(0, "subItem14");
              subItem14->setCheckState(0, Qt::Unchecked);

            //第二個(gè)分組
              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->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
              subItem21->setText(0, "subItem21");
              subItem21->setCheckState(0, Qt::Unchecked);

              QTreeWidgetItem *subItem22 = new QTreeWidgetItem(group2);
              subItem22->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
              subItem22->setText(0, "subItem22");
              subItem22->setCheckState(0, Qt::Unchecked);

              QTreeWidgetItem *subItem23 = new QTreeWidgetItem(group2);
              subItem23->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
              subItem23->setText(0, "subItem23");
              subItem23->setCheckState(0, Qt::Unchecked);

            }

            void TreeWidgetTest::treeItemChanged(QTreeWidgetItem* item, int column)
            {
              QString itemText = item->text(0);
              //選中時(shí)
            if (Qt::Checked == item->checkState(0))
            {
               QTreeWidgetItem* parent = item->parent();
               int count = item->childCount();
               if (count > 0)
               {
                for (int i = 0; i < count; i++)
                {
                 //子節(jié)點(diǎn)也選中
                 item->child(i)->setCheckState(0, Qt::Checked);
                }   
               }
               else
               {
                //是子節(jié)點(diǎn)
                updateParentItem(item);
               }
            }
            else if (Qt::Unchecked == item->checkState(0))
            {
               int count = item->childCount();
               if (count > 0)
               {
                for (int i = 0; i < count; i++)
                {
                 item->child(i)->setCheckState(0, Qt::Unchecked);
                }
               }
               else
               {
                updateParentItem(item);
               }
            }

            }

            void TreeWidgetTest::updateParentItem(QTreeWidgetItem* item)
            {
            QTreeWidgetItem *parent = item->parent();
            if (parent == NULL)
            {
               return;
            }

            //選中的子節(jié)點(diǎn)個(gè)數(shù)
            int selectedCount = 0;
            int childCount = parent->childCount();
            for (int i = 0; i < childCount; i++)
            {
               QTreeWidgetItem *childItem = parent->child(i);
               if (childItem->checkState(0) == Qt::Checked)
               {
                selectedCount++;
               }
            }

            if (selectedCount <= 0)
            {
               //選中狀態(tài)
               parent->setCheckState(0, Qt::Unchecked);
            }
            else if (selectedCount > 0 && selectedCount < childCount)
            {
               //部分選中狀態(tài)
               parent->setCheckState(0, Qt::PartiallyChecked);
            }
            else if (selectedCount == childCount)
            {
              //未選中狀態(tài)
               parent->setCheckState(0, Qt::Checked);
            }

            //changeFromUser = true;

            }

                  上面需要注意的是,當(dāng)用代碼setCheckState后,會(huì)觸發(fā)itemChanged事件,有時(shí)這個(gè)會(huì)帶來麻煩,這時(shí)需要加一些標(biāo)志來判斷是由用戶操作產(chǎn)生的還是程序本身代碼產(chǎn)生的。

            posted on 2012-03-31 10:49 米米 閱讀(3250) 評(píng)論(0)  編輯 收藏 引用 所屬分類: qt
            久久久久亚洲Av无码专| 九九久久精品无码专区| 色婷婷噜噜久久国产精品12p| 99久久人妻无码精品系列| 狠狠狠色丁香婷婷综合久久五月 | …久久精品99久久香蕉国产| 久久精品国产99国产电影网| 久久99精品国产99久久| 久久久久亚洲av毛片大| 久久久一本精品99久久精品66| 色综合久久88色综合天天| 亚洲另类欧美综合久久图片区| 色狠狠久久AV五月综合| 精品久久久久久国产牛牛app| 久久人人爽人人爽人人片AV麻烦| 久久综合亚洲欧美成人| 久久久久国产| 久久亚洲欧美日本精品| 一本一道久久综合狠狠老| 伊人久久精品线影院| 亚洲综合精品香蕉久久网| 久久精品国产精品亚洲艾草网美妙 | 久久免费大片| 麻豆亚洲AV永久无码精品久久| 精品国产乱码久久久久久1区2区| 日韩久久无码免费毛片软件| 日韩精品国产自在久久现线拍| 国产aⅴ激情无码久久| 亚洲国产精品无码久久久久久曰| 久久se精品一区精品二区| 久久精品人人做人人爽97 | 国产亚洲精品久久久久秋霞| 国内精品久久久久久麻豆| 久久精品国产亚洲av水果派| 18岁日韩内射颜射午夜久久成人| 久久久久亚洲精品天堂久久久久久 | 伊人情人综合成人久久网小说| 伊人久久精品无码二区麻豆| 久久久久波多野结衣高潮| 久久青青色综合| 久久天天躁夜夜躁狠狠躁2022|