• <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 米米 閱讀(3251) 評論(0)  編輯 收藏 引用 所屬分類: qt
            国产精品久久精品| 狠狠色丁香婷婷久久综合五月 | 国产成人精品久久亚洲高清不卡| 久久精品人人槡人妻人人玩AV| 中文字幕人妻色偷偷久久| 久久99久久99小草精品免视看| 久久久久国产精品三级网| 97精品伊人久久久大香线蕉| 久久亚洲欧美日本精品| 国色天香久久久久久久小说| 色成年激情久久综合| 久久久久久久97| 精品国产青草久久久久福利| 亚洲精品tv久久久久久久久 | 99久久免费国产特黄| 免费精品久久久久久中文字幕| 久久不见久久见免费视频7| 亚洲精品97久久中文字幕无码| 99久久婷婷国产综合亚洲| 一本久久综合亚洲鲁鲁五月天| 一本大道加勒比久久综合| 久久精品国产亚洲AV高清热| 久久精品极品盛宴观看| 色综合久久久久| 久久精品免费观看| 久久精品国产亚洲AV麻豆网站| 欧美黑人激情性久久| 久久综合狠狠综合久久97色| 成人国内精品久久久久影院| 日本欧美久久久久免费播放网| 一本色道久久综合狠狠躁篇 | 久久九九久精品国产| 26uuu久久五月天| 久久福利青草精品资源站| 精品人妻久久久久久888| 国内精品久久人妻互换| 熟妇人妻久久中文字幕| 久久亚洲精品无码AV红樱桃| 久久久久亚洲AV片无码下载蜜桃| 亚洲av日韩精品久久久久久a| 狠狠色综合网站久久久久久久高清 |