QTreeWidget右键菜单

时间:2013-01-09 14:05:17

标签: qt popupmenu qtreewidget

我环顾四周,似乎问题不仅存在于树小部件中,也存在于其他小部件中。但就我而言,我找到了一个解决方案,虽然不完整。我正在向树窗口小部件添加操作,因此当您右键单击它时,会出现带有这些操作的弹出窗口。但是,当我向我的树窗口小部件添加项目并右键单击它们时,会出现相同的弹出窗口。 我想要做的是,当您右键单击树窗口小部件时,会出现树窗口小部件弹出菜单,当您右键单击项目时,会出现另一个相应的弹出菜单。有谁知道怎么做?

4 个答案:

答案 0 :(得分:16)

首先,您应将context menu policy设置为CustomContextMenu

treeView->setContextMenuPolicy(Qt::CustomContextMenu);

然后您可以连接到QWidget::customContextMenuRequested(const QPoint&)信号并显示您的上下文菜单。

答案 1 :(得分:16)

首先,将QTreeWidget配置为响应(发出信号)鼠标右键单击:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

其次,将信号与您的插槽“MainWindow :: prepareMenu”连接:

connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu);

第三,在插槽中创建上下文菜单:

void MainWindow::prepareMenu( const QPoint & pos )
{
QTreeWidget *tree = treeWid;

QTreeWidgetItem *nd = tree->itemAt( pos );

qDebug()<<pos<<nd->text(0);


QAction *newAct = new QAction(QIcon(":/Resource/warning32.ico"), tr("&New"), this);
newAct->setStatusTip(tr("new sth"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newDev()));


QMenu menu(this);
menu.addAction(newAct);

QPoint pt(pos);
menu.exec( tree->mapToGlobal(pos) );
}

答案 2 :(得分:2)

看看重载QAbstractItemModel并提供自己的OnContextMenuRequested。通过此功能,您可以使用不同的项目创建不同的上下文菜单。

这是我的一个项目中的一些缩短的伪代码,可能会有所帮助:

void MyModel::OnContextMenuRequested(const QModelIndex& index, const QPoint& globalPos)
{
// find 'node' corresponding to 'index'

vector<pair<string,BaseNode*> > actions = node->GetActions(true);
if(actions.size()==0) return;

// the ptr list helps us delete the actions
boost::ptr_list<QObject> actionPtrList;
QList<QAction*> qtActions;
for(unsigned int i=0;i<actions.size();i++)
{
    QAction* act = new QAction(actions[i].first.c_str(),NULL);
    act->setData(qVariantFromValue(actions[i].second));
    actionPtrList.push_back(act);
    qtActions.append(act);
}

// create and show the context menu
QMenu *menu = new QMenu("Item actions",NULL);
actionPtrList.push_back(menu);
QAction* act = menu->exec(qtActions,globalPos);
if(act==NULL) return;

// act on the resulting action 'act'
}

答案 3 :(得分:1)

对于那些更喜欢使用设计师的人,这是另一种实现方法:

1)将上下文菜单策略设置为自定义上下文菜单

通过代码之一

ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

或使用图形设计器,单击树小部件并使用属性编辑器进行设置:

enter image description here

2)创建Handler函数

在设计器中,右键单击treeWidget,然后选择“转到插槽...”选项。将会出现类似的窗口:

enter image description here

单击“ CustomContextMenuRequested(QPoint)”选项。处理函数将被定义,声明并自动连接。

void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
  // this function will be called on right click
}

也可以通过自己定义和连接插槽功能来完成此步骤。

3)在上下文菜单上创建选项。

enter image description here

转到动作编辑器选项卡(通常停在设计器的底部)。通过单击左上角的“新建”按钮来添加要在上下文菜单上执行的操作。您将遇到这样的界面:

enter image description here

您可以(可选)具有操作的工具提示或图标,或使其可检查。您可以创建Ctrl + C之类的快捷键来执行复制操作。

4)创建菜单并触发它

void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
    QMenu menu(this); // add menu items
    menu.addAction(ui->actionDelete);
    menu.addEdit(ui->actionDelete);
    ...

    ui->actionDelete->setData(QVariant(pos)); // if you will need the position data save it to the action

    menu.exec( ui->treeWidget->mapToGlobal(pos) );
}

5)为每个动作创建处理程序功能

就像在步骤2中一样,创建插槽功能并手动连接它,或者右键单击一个动作,单击“转到插槽...”选项,然后选择Triggered()插槽。

enter image description here

6最后,将您的逻辑应用于slot函数

void MainWindow::on_actionEdit_triggered()
{
    QTreeWidgetItem *clickedItem = ui->treeWidget->itemAt(ui->actionDelete->data().toPoint());

    // your logic
}