سؤال

أرغب في منبثقة قائمة منبثقة ، عندما ينقر المستخدم على كائن في QTreewIdgetItem. على الرغم من أنني حول اصطياد سياق الإشارة من QWidget ثم استرداد الفهرس من العرض باستخدام ItemAT. لكن هذا لا يبدو جميلًا جدًا. هل هناك أي طريقة أسهل لتكون قادرًا على استدعاء قائمة على عنصر داخل طريقة العرض؟

هل كانت مفيدة؟

المحلول

اكتب 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));

نصائح أخرى

أنا أستخدم شيئًا كهذا:

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]

ما فعلته بأسلوب الإشارة/الفتحة الجديدة:

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. وإذا قمت بالنقر فوق "الطباعة" ، فسيقوم في وحدة التحكم الخاصة بك بطباعة العنصر الذي يحتوي على التركيز الحالي ، فهو الشخص الذي انقر بزر الماوس الأيمن.

ملاحظة: العنصر الحالي ليس ضروريًا للعنصر المحدد ، فإن العنصر المحدد هو العنصر الذي نقرت عليه مؤخرًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top