Qt 创建带有复选框的下拉树

Qt 的自定义组件可以将任何自己想要的效果表达出来。这篇文件就讲解下如何在Qt 下创建 带有复选框的树,这个数是点击按钮弹出来的。效果如下图所示:


思路是这样的:

1, 整体控件是从QWidget继承而来。因为QWidget实现的是非常干净的,不像QMainwindow。所以一般来说自定义控件都会从QWidget继承。

2,将所需要的对象逐一New出来。

3,对QTreeWidget插入item,在插入item时,将item设置为带有复选框的。在Qt中每个Item都是有复选框选项的,只要将其设置一下就OK了。

4,将action关联到QTreeWidget和Menu上。将Menu关联到QToolButton上。

废话不多说,上代码:

 
  
.h文件
#include 
#include 
#include 
#include 
#include 

class SelectMenuFrm : public QWidget
{
    Q_OBJECT
public:
    explicit SelectMenuFrm(QWidget *parent = 0);

private:
    void init();

public slots:

    void setToolButtonText();

private:
    QToolButton* m_toolbutton;
    QTreeWidget* m_treeWidget;
    QWidgetAction* m_widgetaction;
    QMenu*  m_menu;
};
.cpp文件
 
  
 
  
SelectMenuFrm::SelectMenuFrm(QWidget *parent) :
    QWidget(parent)
{
    init();
}
void SelectMenuFrm::init()
{
    m_toolbutton = new QToolButton(this);
    //设置QToolButton为弹式菜单
    m_toolbutton->setPopupMode(QToolButton::InstantPopup);
    m_menu = new QMenu(this);
    m_treeWidget = new QTreeWidget(m_menu);
    m_widgetaction = new QWidgetAction(m_treeWidget);
    m_treeWidget->setFrameShape(QFrame::NoFrame);//设置无边框
    //设置弹出的菜单大小
    m_treeWidget->setMaximumHeight(200);
    m_treeWidget->setMaximumWidth(200);
    //插入条目并且设置可选框(所有的item都是可以设置可选框的)
    for (int i = 0; i < 4; i++)
    {
        QStringList str;
        str << QString("1") << QString("2");
        QTreeWidgetItem* item = new QTreeWidgetItem(str);
        QTreeWidgetItem* childItem = new QTreeWidgetItem(str);
        item->addChild(childItem);
        item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
        childItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
        item->setCheckState(0, Qt::Unchecked);
        childItem->setCheckState(0, Qt::Unchecked);
        m_treeWidget->addTopLevelItem(item);
        m_treeWidget->setHeaderHidden(true);
    }
    m_widgetaction->setDefaultWidget(m_treeWidget);
    m_menu->addAction(m_widgetaction);
    m_toolbutton->setMenu(m_menu);
    connect(m_treeWidget, SIGNAL(itemChanged(QListWidgetItem*)),
            this, SLOT(setToolButtonText()));
}
void SelectMenuFrm::setToolButtonText()
{
    m_toolbutton->setText(QString("000"));
}

在代码中给QTreeWidget关联了一个信号槽,在中QTreeWidget中某一项或者多项时,QToolButton的Text就会改变。
在这个槽里面可以干很多事情,我这里就只是例举了一下而已。
这里面还可以设置父亲的选项勾上则子必定要勾上等等一系列事件都可以进行设置。
 
  
其实不管是QTreeWidget, QListWidget, QTableWidget 都可以这样设置。
 
  
本人亦是Qt新手,如有错误地方请留言出来。谢谢。共同学习
 
  
 
  
 
  

你可能感兴趣的:(Qt)