我想彈出一個菜單,當用戶點擊QTreeWidgetItem中的一個對象時。我雖然關於從QWidget捕獲信號contextMenuRequested,然後使用itemAt從視圖中檢索索引。但這看起來不太漂亮。有沒有更簡單的方法可以調用視圖內某個項目的菜單?在QTreeWidget中調用上下文菜單
4
A
回答
4
寫自己的自定義ItemDelegate和QAbstractItemDelegate::editorEvent
處理click事件。 您可以從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));
0
我使用的是這樣的:
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]
0
我做了新的信號/插槽的風格是什麼:
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中單擊鼠標右鍵。如果您點擊「打印」,在您的控制檯中它將打印出當前焦點的項目,這是您右鍵單擊的項目。
注意:當前項目不是必需的選定項目,所選項目是您最近點擊的項目。
謝謝,這看起來相當漂亮:-)事件直接在項目中處理。 – gruszczy 2009-11-23 09:59:10
什麼是ContextMenuHandler?爲什麼需要? – Prady 2013-04-05 03:31:24