【问题标题】:Invoking context menu in QTreeWidget在 QTreeWidget 中调用上下文菜单
【发布时间】:2010-12-18 19:17:39
【问题描述】:

当用户单击 QTreeWidgetItem 中的对象时,我想弹出一个菜单。我想从 QWidget 捕获信号 contextMenuRequested,然后使用 itemAt 从视图中检索索引。但这似乎不是很漂亮。有没有更简单的方法可以在视图内的项目上调用菜单?

【问题讨论】:

    标签: python qt pyqt qtreewidget


    【解决方案1】:

    我对新的信号/槽样式做了什么:

    self.treeMenu = QMenu()
    self.treeAction = QAction('print', self.treeMenu)
    self.treeAction.triggered.connect(self.printTreeItem)
    self.treeWidget.addAction(self.treeAction)
    
    @pyqtSlot()    
    def printTreeItem(self):
        print self.treeWidget.currentItem().text(0)
    

    当您在 treeWidget 中单击鼠标右键时,这将打开一个菜单。如果您单击“打印”,在您的控制台中它将打印出具有当前焦点的项目,即您右键单击的项目。

    注意:当前项不一定是选中项,选中项是你最近点击的那个。

    【讨论】:

      【解决方案2】:

      编写您自己的自定义 ItemDelegate 并处理QAbstractItemDelegate::editorEvent 中的点击事件。 您可以从 QModelIndex 检索单元格中的数据。 在 C++ 中,它看起来像这样:

      class ItemDelegate: public QItemDelegate
      {
      public:
          ItemDelegate(ContextMenuHandler *const contextMenu, QObject *const parent )
              : QItemDelegate(parent)
              , m_contexMenu(contextMenu) 
          {
          }
      
          bool editorEvent( 
                  QEvent * event, 
                  QAbstractItemModel * model, 
                  const QStyleOptionViewItem & option, 
                  const QModelIndex & index )
          {
              if((event->type()==QEvent::MouseButtonPress) && index.isValid())
              {
                  QMouseEvent *const mouseEvent = qobject_cast<QMouseEvent>(event);
                  if(mouseEvent && (mouseEvent->button()==Qt::RightButton))
                  {
                      return m_contexMenu->showContextMenu(mouseEvent->pos(), index);
                  }
              }
          }
          ContextMenuHandler *const m_contextMenu;
      };
      
      treeWidget->setItemDelegate(new ItemDelegate(contextMenuHandler,treeWidget));
      

      【讨论】:

      • 谢谢,这看起来很漂亮:-) 事件直接在项目中处理。
      • 什么是 ContextMenuHandler ?为什么需要?
      【解决方案3】:

      我正在使用这样的东西:

      self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu)
      removeLayerAction = QAction("Remove selected layer", self)
      self.connect(removeLayerAction, SIGNAL('triggered()'), self.layers_widget_controller.remove_selected_layer)
      

      并检查哪个项目触发了信号:

      selected_item = self.main_window.widget_layers.selectedItems()[0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多