关于qt中的QTreeWidget的拖放问题

关于qt中的QTreeWidget的拖放问题,第1张

void QTreeWidget::itemEntered ( QTreeWidgetItem item, int column ) [signal]

This signal is emitted when the mouse cursor enters an item over the specified column QTreeWidget mouse tracking needs to be enabled for this feature to work

你把treewidget->setMouseTracking(true)试下

滤过父节点不可能,但是双击目标,还可以产生响应的事件。这是我写过的代码:单击事件(可以改双击,内容一样)

首先再 建树时注意加上一句:

HTREEITEM root = m_treeInsertItem(_T("图层集合"),TVI_ROOT);

m_treeSetItemData(root, 0);//就是加上的语句,0(可变)就是后面的nDat

void TreeDolg::OnNMClickTree1(NMHDR pNMHDR, LRESULT pResult)

{

// TODO: 在此添加控件通知处理程序代码

CPoint pt = GetCurrentMessage()->pt;//获取当前鼠标点击消息的坐标点

m_treeScreenToClient(&pt);//将鼠标的屏幕坐标,转换成树形控件的客户区坐标

UINT uFlags = 0;

HTREEITEM hItem = m_treeHitTest(pt, &uFlags);//然后做点击测试

if ((hItem != NULL) && (TVHT_ONITEM & uFlags))//如果点击的位置是在节点位置上面

{

m_treeSelectItem(hItem);

//获取开始我们设置的数据,注意这就是我为什么开始要每个节点设置不同的数据的原因。

//当然,如果你的数据节点比较少,你也可以通过获取节点的文字,如上面设置的"海淀区"

//,然后通过字符串比较来判断点击了哪个节点

int nDat = m_treeGetItemData(hItem); //然后根据不同的节点,你完成不同的动作即可

switch(nDat)

{

case 0:

break;

default:

}

}

pResult = 0;

}

开发环境:win10、QT59

开发工具:vs2019

1、根据搜索框的内容匹配下面的索引,找到则显示该字段及该字段的上下索引;

2、当找不到该内容则全都不显示;

3、部分字段匹配搜索,输入的字段与索引项存在部分匹配的时候则同样会显示该索引项及其父子索引项;

1、实现该界面

    该界面包括一个QLineEdit控件和一个QTreeWidget控件。

2、使用递归实现对查找到的项的父子索引项遍历且设置为可见

//使用递归的方式向目标节点的父节点进行递归查找

void TableWidgwet::showParent(QTreeWidgetItem pItem)

{

    if (pItem != nullptr)    //判断当前节点是否存在

    {

        QTreeWidgetItem pTreeParentItem = pItem->parent(); //获取当前节点的父节点

        if (pTreeParentItem != nullptr)  //判断父节点是否存在

        {

            pTreeParentItem->setHidden(false);  //将该父级索引项设置为显示

            showParent(pTreeParentItem);//直接传入处理过的节点

           //避免传入该节点后递归后跳转到祖父节点

        }

   }

}

//使用递归的方式遍历子节点同时设置为显示

void TableWidgwet::showSon(QTreeWidgetItem pItem)

{

    int iChild = pItem->childCount();  //获取该子节点的数目

    for (int i = 0; i < iChild; ++i)//遍历当前项的子节点并设置

    {

        pItem->child(i)->setHidden(false);

        showSon(pItem->child(i));//对当前 子项进行递归

    }

}

3、对当前的节点进行遍历查找且对遍历的节点进行显示和隐藏的设置

//依旧是采用递归的方式实现

void TableWidgwet::searchItem(QTreeWidgetItem tableItem,QString& strText)

{

    if (tableItem != nullptr)//防止野指针的问题

    {

        for (int i = 0; i < tableItem->childCount(); ++i)

        {

            QTreeWidgetItem pTreeItem = tableItem->child(i);

            if (pTreeItem != nullptr)

            {

              //如何索引项字段部分匹配于输入框字段则设置该项及其父子项显示且展开

                if (pTreeItem->text(0)contains(strText))

                {

                    pTreeItem->setHidden(false);

                    pTreeItem->setExpanded(true);

                    showSon(pTreeItem);

                    showParent(pTreeItem);

                }

                else

                {

                    pTreeItem->setHidden(true);//不匹配则隐藏

                    searchItem(pTreeItem, strText);//递归遍历

                }

            }

        }

    }

}

4、对整个树形索引控件的一级索引项进行遍历,并调用上述的函数实现对每个一级索引项下的索引项进行递归遍历设置

void TableWidgwet::showItem()

{

    for (int i = 0; i < uitreeWidget->topLevelItemCount(); ++i)

    {

            if (uitreeWidget->topLevelItem(i)->text(0)contains(uilineEdit->text()))

            {

                uitreeWidget->topLevelItem(i)->setHidden(false);

            }

        else

            {

                uitreeWidget->topLevelItem(i)->setHidden(true);

            }

        searchItem(uitreeWidget->topLevelItem(i), uilineEdit->text());

    }

}

5、使用connect对QLineEdit的textchange事件响应与槽函数绑定处理

        connect(uilineEdit, &QLineEdit::textChanged, this, &TableWidgwet::showItem);

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控件

以上就是关于关于qt中的QTreeWidget的拖放问题全部的内容,包括:关于qt中的QTreeWidget的拖放问题、怎么判断qtreewidgetitem是否是父节点、QT的QTreeWidget实现搜索框的效果等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9804383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存