• <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++博客 首頁 新隨筆 聯系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks
            今天簡單說一下Qt的樹形控件,在Qt中樹形控件的名稱叫做QTreeWidget,而控件里的樹節點的名稱叫做QTreeWidgetItem。今天這 里講的是如何創建具有復選框的樹形控件,這種控件其實有時挺有用的,如飛信群發短信時的選擇聯系人的界面中就使用了有復選框的樹形控件。先來看一下長什么 樣的:

            當選中頂層的樹形節點時,子節點全部被選中,當取消頂層樹形節點時,子節點全部被取消選中狀態,而當選中子節點時,父節點顯示部分選中的狀態。

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

                  ui.setupUi(this);

                   //初始化
                    init();

                 //連接信號和槽

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

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

               //第一個分組
               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);

            //第二個分組
              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);
              //選中時
            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))
            {
               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;
            }

            //選中的子節點個數
            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)
            {
               //選中狀態
               parent->setCheckState(0, Qt::Unchecked);
            }
            else if (selectedCount > 0 && selectedCount < childCount)
            {
               //部分選中狀態
               parent->setCheckState(0, Qt::PartiallyChecked);
            }
            else if (selectedCount == childCount)
            {
              //未選中狀態
               parent->setCheckState(0, Qt::Checked);
            }

            //changeFromUser = true;

            }

                  上面需要注意的是,當用代碼setCheckState后,會觸發itemChanged事件,有時這個會帶來麻煩,這時需要加一些標志來判斷是由用戶操作產生的還是程序本身代碼產生的。

            posted on 2012-03-31 10:49 米米 閱讀(3249) 評論(0)  編輯 收藏 引用 所屬分類: qt
            久久久91人妻无码精品蜜桃HD| 国产精品gz久久久| 伊人久久大香线蕉AV色婷婷色| 亚洲熟妇无码另类久久久| 国产精品久久久久久| 久久人人爽人人爽人人片AV麻豆| 亚洲精品97久久中文字幕无码| 一本久久a久久精品vr综合| 久久精品国产只有精品2020| 久久毛片一区二区| 久久国产综合精品五月天| 久久精品国产亚洲AV嫖农村妇女| 久久se这里只有精品| 伊人久久大香线蕉综合影院首页| 国产综合免费精品久久久| 无码精品久久久天天影视| 久久久久综合国产欧美一区二区| 99久久精品午夜一区二区| 性做久久久久久久久久久| 99久久国产综合精品成人影院| 亚洲精品白浆高清久久久久久 | 国产99久久精品一区二区| 亚洲精品高清一二区久久| 国产精品成人99久久久久91gav| 久久夜色精品国产噜噜亚洲AV| 久久精品国产亚洲AV不卡| 久久天天躁狠狠躁夜夜avapp| 偷偷做久久久久网站| 久久久久亚洲AV无码专区首JN | 久久成人永久免费播放| 久久久精品午夜免费不卡| 久久水蜜桃亚洲av无码精品麻豆| 国产激情久久久久久熟女老人| 狠狠色丁香婷婷久久综合| 国产一区二区久久久| 麻豆av久久av盛宴av| 一本久久知道综合久久| 久久久久久亚洲精品成人| 久久天天躁狠狠躁夜夜躁2O2O| 麻豆一区二区99久久久久| 国内精品久久久久影院日本|