сигналы / слоты pyQt с помощью QtDesigner - PullRequest
3 голосов
/ 23 сентября 2011

Я пытаюсь написать программу, которая будет взаимодействовать с QGraphicsView.Я хочу собирать события мыши и клавиатуры, когда это происходит в QGraphicsView.Например, если пользователь нажимает на виджет QGraphicsView, я получу положение мыши, что-то вроде этого.Я могу довольно легко написать это жестко, но я хочу использовать QtDesigner, потому что пользовательский интерфейс будет часто меняться.

Это код, который у меня есть для gui.py.Простой виджет с QGraphicsView в нем.

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_graphicsViewWidget(object):
    def setupUi(self, graphicsViewWidget):
        graphicsViewWidget.setObjectName(_fromUtf8("graphicsViewWidget"))
        graphicsViewWidget.resize(400, 300)
        graphicsViewWidget.setMouseTracking(True)
        self.graphicsView = QtGui.QGraphicsView(graphicsViewWidget)
        self.graphicsView.setGeometry(QtCore.QRect(70, 40, 256, 192))
        self.graphicsView.setObjectName(_fromUtf8("graphicsView"))

        self.retranslateUi(graphicsViewWidget)
        QtCore.QMetaObject.connectSlotsByName(graphicsViewWidget)

    def retranslateUi(self, graphicsViewWidget):
        graphicsViewWidget.setWindowTitle(QtGui.QApplication.translate("graphicsViewWidget", "Form", None, QtGui.QApplication.UnicodeUTF8))

Код программы:

#!/usr/bin/python -d

import sys
from PyQt4 import QtCore, QtGui
from gui import Ui_graphicsViewWidget

class MyForm(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_graphicsViewWidget()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.graphicsView, QtCore.SIGNAL("moved"), self.test)

    def mouseMoveEvent(self, event):
        print "Mouse Pointer is currently hovering at: ", event.pos()
        self.emit(QtCore.SIGNAL("moved"), event)

    def test(self, event):
        print('in test')

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

Когда я запускаю этот код, он дает мне противоположность того, что я хочу.Я определяю положение мыши везде, кроме как внутри QGraphicsView.

Я уверен, что это проблема с моим QObject.connect.Но каждый раз, когда я возвращаюсь и читаю о сигналах и слотах, это имеет смысл, но я не могу этого понять.

Пожалуйста, помогите, я бью себя по голове последние несколько дней.Мне жаль, если об этом уже спрашивали, но я перебрал все темы по этой теме и нигде не могу найти.

Спасибо

1 Ответ

3 голосов
/ 24 сентября 2011

Сигнал должен исходить от объекта QGraphicsView, который был определен в пользовательском интерфейсе.

Вы можете создать класс, производный от QGraphicsView, как это

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

class MyView(QGraphicsView):
    moved = pyqtSignal(QMouseEvent)

    def __init__(self, parent = None):
        super(MyView, self).__init__(parent)

    def mouseMoveEvent(self, event):
        # call the base method to be sure the events are forwarded to the scene
        super(MyView, self).mouseMoveEvent(event)

        print "Mouse Pointer is currently hovering at: ", event.pos()
        self.moved.emit(event)

Тогда в конструкторе:

  • щелкните правой кнопкой мыши QGraphicsView, а затем Повышите до
  • введите имя класса в поле Promoted Class Name (например, «MyView»),
  • записать имя файла, в котором находится этот класс, в поле Файл заголовка , но без расширения .py ,
  • нажмите кнопку Добавить , а затем кнопку Повышение .

И вы можете восстановить ваш файл gui.py с помощью pyuic4.

...