【问题标题】:QTreeWidget right click menuQTreeWidget 右键菜单
【发布时间】:2013-01-09 14:05:17
【问题描述】:

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

【问题讨论】:

    标签: qt popupmenu qtreewidget


    【解决方案1】:

    首先,配置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) );
    }
    

    【讨论】:

    • 感谢指出QTreeWidgetItem *nd = tree-&gt;itemAt( pos );
    【解决方案2】:

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

    treeView->setContextMenuPolicy(Qt::CustomContextMenu);
    

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

    【讨论】:

    • 这似乎比我更复杂。所以实际上我需要将 customContextMenuRequested 信号连接到我的插槽?
    • 是的,您应该有一个插槽,可以在捕捉到该信号后显示您的自定义上下文菜单。
    【解决方案3】:

    对于那些更喜欢使用设计器的人,这里有另一种方法:

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

    通过代码:

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

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

    2) 创建处理函数

    在设计器中,右键单击 treeWidget 并选择“Go to Slot...”选项。会出现类似这样的窗口:

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

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

    这一步也可以通过自己定义和连接槽函数来完成。

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

    转到操作编辑器选项卡(通常停靠在设计器的底部)。通过单击左上角的新按钮,在上下文菜单中添加您想要的操作。你会遇到这样的界面:

    您可以(可选)为操作设置工具提示或图标,或使其可检查。您可以为复制操作创建一个快捷键,例如 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 步一样,要么创建插槽函数并手动连接它,要么右键单击一个动作,单击“转到插槽...”选项并选择触发()插槽。

    6) 最后,在槽函数中应用你的逻辑

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

    【讨论】:

      【解决方案4】:

      看看重载 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'
      }
      

      【讨论】:

      • 尽管如此,模型中没有理由这样做。这是来自视图的信号,模型通常不应该知道。
      猜你喜欢
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多