Pregunta

Tengo un archivo ui.py con la definición de clase MainWindow (crea con QT Designer y Pyside). La interfaz de usuario se importa en el módulo principal. En la interfaz de usuario tengo un cuadro de lista. Según el mouse izquierdo o derecho, el mouse en un elemento, se debe ejecutar un procedimiento, por ejemplo, la izquierda -musos y la derecha -mouseClicked. Gracias por tu ayuda.

¿Fue útil?

Solución

Puede definir un método MousepressEvent () en su subclase QListWidget para manejar el evento de prensa del mouse. Obtenga qué botón se hace clic en el parámetro del evento y guárdelo en un atributo.

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyListWidget(QListWidget):
    def __init__(self, parent=None):
        super(MyListWidget, self).__init__(parent)
        self.itemClicked.connect(self.on_item_clicked)

    def mousePressEvent(self, event):
        self._mouse_button = event.button()
        super(MyListWidget, self).mousePressEvent(event)

    def on_item_clicked(self, item):
        print item.text(), self._mouse_button

class Frame(QWidget):
    def __init__(self, parent=None):
        super(Frame, self).__init__(parent)    
        self.item_ctrl = items = MyListWidget(self)     
        self.item_ctrl.addItem("Item1")
        self.item_ctrl.addItem("Item2")
        box = QVBoxLayout()
        box.addWidget(self.item_ctrl)
        self.setLayout(box)

if __name__ == "__main__":
    import sys    
    app = QApplication(sys.argv)
    main = Frame()
    main.show()
    sys.exit(app.exec_())

Editar: si usa QListView:

import sys
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

def main(): 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 

class MyWindow(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args) 

        # create table
        list_data = [1,2,3,4]
        lm = MyListModel(list_data, self)
        lv = MyListView()
        lv.setModel(lm)
        lv.clicked.connect(self.item_clicked)
        self.lv = lv

        # layout
        layout = QVBoxLayout()
        layout.addWidget(lv) 
        self.setLayout(layout)

    def item_clicked(self, index):
        print "row=", index.row(), "button=", self.lv._mouse_button

class MyListView(QListView):
    def mousePressEvent(self, event):
        self._mouse_button = event.button()
        super(MyListView, self).mousePressEvent(event)

class MyListModel(QAbstractListModel): 
    def __init__(self, datain, parent=None, *args): 
        """ datain: a list where each item is a row
        """
        QAbstractListModel.__init__(self, parent, *args) 
        self.listdata = datain

    def rowCount(self, parent=QModelIndex()): 
        return len(self.listdata) 

    def data(self, index, role): 
        if index.isValid() and role == Qt.DisplayRole:
            return QVariant(self.listdata[index.row()])
        else: 
            return QVariant()

if __name__ == "__main__": 
    main()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top