看到一些人经常会问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)));// 可将某一项的字体变颜色!