QTreeWidget的使用

本文深入探讨了QTreeWidget的使用方法,包括基本用法、高级特性、树型结构的构建与展示,以及如何实现右键菜单。通过实例演示,帮助开发者熟练掌握QTreeWidget的灵活应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到一些人经常会问QTreeWidget的列宽怎么设啊,怎么固定列宽哦,行宽怎么设啊什么的.其实慢慢看manual就会找到了,下面就列下常用的方法:


1.基本用法:

初始化用基本用到的:

 //this->setMouseTracking(true);
this->setRootIsDecorated(false);
this->setSelectionMode(QAbstractItemView::ExtendedSelection);
this->setStyleSheet("QTreeWidget::item{height:25px}");  //设置行宽,     我也找不到提供的接口  setStyleSheet很强大建议看

this->setColumnWidth(0, 100);  //设置列宽
this->setColumnCount(2);
QStringList lists;
lists << "NO" << "name";
this->setHeaderLabels(lists);


for (int i=0;i<10;i++)
{

QStringList contentList;
contentList << QString("00%1").arg(i) << "boy";
  QTreeWidgetItem *pNewItem = new QTreeWidgetItem(this, contentList);  //增加
pNewItem->setBackgroundColor(0, QColor(150,0,0));
pNewItem->setFont(0, QFont());
}

//pNewItemRoot->setExpanded(true);  //展开子项


增加删除顶层用:

addTopLevelItem(QTreeWidgetItem*);

takeTopLeveltem(int);

topLevelItem(int); //返回

topLevelItemCount();

增加删除子层:

addChild(QTreeWidgetItem*);

addChildren(const QList<QTreeWidgetItem*>&);

takeChild(int);

takeChildren();

child(int)  //返回

childCount();

2.进价:

//加checkbox, icon

pNewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
pNewItem->setCheckState(0, Qt::Unchecked);

//pNewItem->setIcon(int , QIcon);


//向ITEM里放一些QT的控件,如QSpinBox,QComboBox,QPushButton等

this->setItemWidget(pNewItem, 0, new QSpinBox());


//获取某项的QRect, 有时候会很有用,如显缩略图:

QRect rect = this->visualItemRect(QTreeWidgetItem*);


//右键菜单重写

contextMenuEvent( QContextMenuEvent * event );或者使用信号itemPressed(QTreeWidgetItem*, int);


//对头的操作,可以用QLabel或者QTreeWidgetItem对头进行初始化,

//隐藏头

header()->hide();

 m_pHeaderView->setClickable(true);  //能够发射sectionClicked(int)信号,可做菜单,显示隐藏列:setSectionHidden(int, bool);isSectionHidden(int);
m_pHeaderView->setMovable(true);
 m_pHeaderView->setResizeMode(0, QHeaderView::Fixed);  //固定列宽
 m_pHeaderView->setDefaultSectionSize(100);  //默认


//排序

treeWidget->setSortingEnabled(true);

treeWidget->header()->setSortIndicatorShown(true);
treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder);

//要自定义就用信号

connect( treeWidget->header(), SIGNAL( sectionClicked(int) ), this, SLOT( sectionClickedSlot(int) ) );

在小项目里,使用qtreewidget完全足够,

如果想更多灵活用法请使用QTreeView等 MODEL/VIEW控件


TreeWidget 与 TreeView 中实现右键菜单稍有不同,

TreeView 中是靠信号与槽 

connect(ui->treeView,SIGNAL(customContextMenuRequested(constQPoint&)), this,SLOT(onCustomContextMenuRequested(constQPoint&)));

实现TreeView内不同地方的右键菜单,文章见 http://blog.youkuaiyun.com/liukang325/article/details/22734735

TreeWidget 中是靠重构 contextMenuEvent(QContextMenuEvent*event)  函数实现不同地方的不同右键菜单的。具体代码如下:


h文件:

private slots:

    void onGrpMenuTriggered(QAction *action);
    void onMemberMenuTriggered(QAction *action);
    void onAddAreaMenuTriggered(QAction *action);

private:
    //grp menu
    QMenu *m_grpMenu;
    //child menu
    QMenu *m_memberMenu;
    QMenu *m_addAreaMenu;

    //grp action
    QAction *m_grpAddOneMember;
    QAction *m_grpDeleteGrp;
    QAction *m_grpAddOneGrp;
    //child action
    QAction *m_memberDelete;
    QAction *m_memberMove;
    QAction *m_memberSyncTime;
    //action
    QAction *m_addAreaAction;
    QAction *m_grpFlush;
    QAction *m_addDev;

    void createItemMenu(); //构造函数中调用此函数

cpp文件:
void MainWindow::createItemMenu()
{
    m_grpMenu = new QMenu(this);
    m_memberMenu = new QMenu(this);
    m_addAreaMenu = new QMenu(this);
    connect(m_grpMenu,SIGNAL(triggered(QAction *)),
            this,SLOT(onGrpMenuTriggered(QAction *)));
    connect(m_memberMenu,SIGNAL(triggered(QAction *)),
            this,SLOT(onMemberMenuTriggered(QAction *)));
    connect(m_addAreaMenu,SIGNAL(triggered(QAction *)),
            this,SLOT(onAddAreaMenuTriggered(QAction *)));

    m_grpAddOneMember = new QAction(tr("增加子区域"),this);
    m_grpAddOneMember->setIcon(QIcon(":/image/add.png"));
    m_grpAddOneGrp = new QAction(tr("增加设备"),this);
    m_grpAddOneGrp->setIcon(QIcon(":/image/add.png"));
    m_grpDeleteGrp = new QAction(tr("删除区域"),this);
    m_grpDeleteGrp->setIcon(QIcon(":/image/delete.png"));

    m_memberDelete = new QAction(tr("删除设备"),this);
    m_memberDelete->setIcon(QIcon(":/image/delete.png"));
    m_memberMove = new QAction(tr("移动设备"),this);
    m_memberMove->setIcon(QIcon(":/image/next.png"));
    m_memberSyncTime = new QAction(tr("同步时间"),this);
    m_memberSyncTime->setIcon(QIcon(":/image/move.png"));

    m_addAreaAction = new QAction(tr("增加区域"),this);
    m_addAreaAction->setIcon(QIcon(":/image/add.png"));
    m_addDev = new QAction(tr("增加设备"),this);
    m_addDev->setIcon(QIcon(":/image/add.png"));
    m_grpFlush = new QAction(tr("刷新列表"),this);
    m_grpFlush->setIcon(QIcon(":/image/update.png"));
}

//重构contextMenuEvent函数,记得#include <QContextMenuEvent>
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    if(item == NULL)
    {
        qDebug()<<"空白处";
        if (m_addAreaMenu->isEmpty())
        {
            //增加区域
            m_addAreaMenu->addAction(m_addAreaAction);
            m_addAreaMenu->addAction(m_addDev);
            m_addAreaMenu->addAction(m_grpFlush);
        }
        //菜单出现的位置为当前鼠标的位置
        m_addAreaMenu->exec(QCursor::pos());
    }
    else if(ui->treeWidget->currentItem()->childCount() > 0)
    {
        if (m_grpMenu->isEmpty())
        {
            //增加子区域
            m_grpMenu->addAction(m_grpAddOneMember);
            //删除区域
            m_grpMenu->addAction(m_grpDeleteGrp);
            m_grpMenu->addAction(m_grpAddOneGrp);
        }
        m_grpMenu->exec(QCursor::pos());
    }
    else if(ui->treeWidget->currentItem()->childCount() == 0)
    {

        if (m_memberMenu->isEmpty())
        {
            //删除设备
            m_memberMenu->addAction(m_memberDelete);
            //移动设备
            m_memberMenu->addAction(m_memberMove);
            //同步时间
            m_memberMenu->addAction(m_memberSyncTime);
        }
        m_memberMenu->exec(QCursor::pos());
    }

    event->accept();
}

void MainWindow::onGrpMenuTriggered(QAction *action)
{
    if (action == m_grpAddOneMember)
    {//增加子区域

    }
    else if (action == m_grpDeleteGrp)
    {//删除区域

    }
    else if(action == m_grpAddOneGrp)
    {

    }
}

void MainWindow::onMemberMenuTriggered(QAction *action)
{
    if (action == m_memberDelete)
    {//删除设备

    }
    else if(action == m_memberMove)
    {//移动设备

    }
    else if(action == m_memberSyncTime)
    {//同步时间

    }
}

void MainWindow::onAddAreaMenuTriggered(QAction *action)
{
    if (action == m_addAreaAction)
    {//增加区域

    }
    if(action == m_addDev)
    {//增加设备

    }
    if(action == m_grpFlush)
    {//刷新

    }
}


树型结构的基本用法:

void MainWindow::createTreeWidget()
{
    QIcon icon;
    icon.addPixmap(QPixmap(":/image/openStatus.png"), QIcon::Normal, QIcon::On);//节点打开状态
    icon.addPixmap(QPixmap(":/image/closeStatus.png"), QIcon::Normal, QIcon::Off);//节点关闭状态

    ui->treeWidget->setColumnCount(1);
    QStringList headers;
    headers << QObject::tr("管理");
    ui->treeWidget->setHeaderLabels(headers);

    QStringList rootName_1;
    rootName_1 << QObject::tr("常用文件夹");
    QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget, rootName_1);
   // rootItem_1->setIcon(0, QIcon(":/image/add.png")); //增加静态图标
    rootItem_1->setIcon(0,icon);


    QStringList childName_1_1;
    childName_1_1 << "所有未读";
    QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem(rootItem_1, childName_1_1);

    rootItem_1->addChild(childItem_1_1);

    QStringList childName_1_2;
    childName_1_2 << QObject::tr("置顶邮件");
    QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem(rootItem_1, childName_1_2);

    rootItem_1->addChild(childItem_1_2);

    QStringList rootName_2;
    rootName_2 << QObject::tr("我的邮箱");
    QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget, rootName_2);

    rootItem_2->setIcon(0,icon);

    QStringList childName_2_1;
    childName_2_1 << QObject::tr("收件箱");
    QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem(rootItem_2, childName_2_1);

    rootItem_2->addChild(childItem_2_1);

    QStringList childName_2_2;
    childName_2_2 << QObject::tr("草稿箱");
    QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem(rootItem_2, childName_2_2);

    rootItem_2->addChild(childItem_2_2);

    QStringList childName_2_3;
    childName_2_3 << QObject::tr("发件箱");
    QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem(rootItem_2, childName_2_3);

    rootItem_2->addChild(childItem_2_3);

    ui->treeWidget->addTopLevelItem(rootItem_1);
    ui->treeWidget->addTopLevelItem(rootItem_2);


    QStringList childName_1_2_1;
    childName_1_2_1 << "测试";
    QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem(childItem_1_2, childName_1_2_1);
    childItem_1_2->addChild(childItem_1_2_1);

}

另一篇TreeWidget 的用法,更加清晰明了的实现树状结构:http://blog.youkuaiyun.com/liukang325/article/details/13768523

补充:

childItem_1_2_1->setForeground(0,QBrush(QColor(Qt::blue)));
// 可将某一项的字体变颜色!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值