Qt中treewidget使用右键菜单功能

参考1

参考2

void setContextMenuPolicy( Qt::ContextMenuPolicy policy)  

该函数可以设置右键菜单的具体模式,一般需要自己写槽函数的都需要设置Qt::ContextMenuPolicy的枚举值为Qt::CustomContextMenu

这个枚举意味着会发出一个信号:
void QWidget::customContextMenuRequested(const QPoint & pos) [signal]  但其只是发送信号,所以要自己去写槽函数slot。槽函数来显示右键菜单,右键菜单显示在pos的位置。

下面写一个实例:

头文件

#include 
#include 
#include 
#include 
#include "ui_menu_test.h"

class menu_test : public QMainWindow
{
	Q_OBJECT

public:
	menu_test(QWidget *parent = Q_NULLPTR);
	QMenu* popMenu;
	QTreeWidgetItem* curItem;
private:
	Ui::menu_testClass ui;
public slots:
	void sltShowPopMenu(const QPoint&);
	void getname1();
	void getname2();
};

头文件的方法实现

#include "menu_test.h"
#include 
#include 
#include 
#include 
#include 

using namespace std;

menu_test::menu_test(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	//设置列数为1
	ui.treeWidget->setColumnCount(1);
	//一级节点是"family"
	QTreeWidgetItem* par = new QTreeWidgetItem((QTreeWidget*)0, QStringList("family"));
	ui.treeWidget->insertTopLevelItem(0, par);

	vector childnodes;
	childnodes.push_back("huihui");
	childnodes.push_back("liuliu");
	childnodes.push_back("qiqi");

	//增加一级节点下的子节点
	QList items;
	for (int j = 0; j < childnodes.size(); ++j)
	{
		QTreeWidgetItem* item_new = new QTreeWidgetItem(par, QStringList(QString::fromStdString(childnodes[j])));
		items.append(item_new);
	}

	setContextMenuPolicy(Qt::CustomContextMenu);  //设置枚举值
	connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),this, SLOT(sltShowPopMenu(const QPoint&)));
}

void menu_test::sltShowPopMenu(const QPoint& pos)//槽函数
{
	curItem = ui.treeWidget->currentItem();  //获取当前被点击的节点

	//如果没有点击到节点
	if (!curItem)
	{
		return;
	}
	//如果是一级节点,可以弹出右键
	else if(!curItem->parent())
	{
		popMenu = new QMenu(ui.treeWidget);
		//添加右键的选项
		QAction* act = popMenu->addAction("get first name of children");
		connect(act, SIGNAL(triggered(bool)), this, SLOT(getname1()));
		popMenu->exec(QCursor::pos());
	}
	//是二级节点
	else
	{
		popMenu = new QMenu(ui.treeWidget);
		//添加右键的选项
		QAction* act = popMenu->addAction("get name of node");
		connect(act, SIGNAL(triggered(bool)), this, SLOT(getname2()));
		popMenu->exec(QCursor::pos());
	}
}

//右键选项的执行函数
void menu_test::getname1()
{
	ui.lineEdit->clear();
	QString name = curItem->child(0)->text(0);
	qDebug() << name << endl;
	ui.lineEdit->setText(name);
}

//右键选项的执行函数
void menu_test::getname2()
{
	ui.lineEdit_2->clear();
	QString name = curItem->text(0);
	qDebug() << name << endl;
	ui.lineEdit_2->setText(name);
}

主函数

#include "menu_test.h"
#include 

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	menu_test w;
	w.show();
	return a.exec();
}

Qt中treewidget使用右键菜单功能_第1张图片

可以看出,当右击一级节点时,弹出的选项是“get first name of children”  点击之后会在第一个框框里边显示huihui。当右击二级节点时,弹出的选项是“get name of node” ,点击之后在第二个框框里边显示对应的二级节点的名字qiqi

 

 

 

你可能感兴趣的:(QT)