1. 程式人生 > >pyqt4不同類之間訊號與槽進行連線

pyqt4不同類之間訊號與槽進行連線

這個部落格是自己在使用pyqt4過程中,解決具體的總結,僅供個人備忘。

不同類之間訊號與槽的對應,需要三個步驟:

1)在類A裡定義發射訊號,使用emit()方法,發射訊號A_signal();

2)在類B裡定義槽函式B_slot();

3)在主函式main()裡,使用類A、B分別例項化兩個物件a、b。

然後使用connect(a, QtCore.SIGNAL('A_signal()'), b.B_slot)

下面是一個例子

程式描述:定義了一個按鈕和一個顯示部件,通過點選按鈕控制顯示部件進行顯示。

所給出的程式碼不完整。

首先是按鈕程式碼:

class Buttontest(QtGui.QWidget):

    def __init__(self):
        super(Buttontest, self).__init__()
        self.initUI()

    def initUI(self):

        self.buttont = QtGui.QPushButton('Start', self)
        
        self.connect(self.buttont, QtCore.SIGNAL('clicked()'), self.totestbutton)

    def totestbutton(self):
        self.emit(QtCore.SIGNAL('buttontest()'))

然後是顯示部件:

class Buttonshowfeature(QtGui.QWidget):

    def __init__(self):
        super(Buttonshowfeature, self).__init__()
        self.initUI()

    def initUI(self):
        self.paintarea = Paintarea()

    def topaintonarea(self):
        self.paintarea.emit(QtCore.SIGNAL('startpaint()'))

class Paintarea(QtGui.QWidget):

    def __init__(self):
        super(Paintarea, self).__init__()

        self.setGeometry(300, 300, 280, 270)
        self.setWindowTitle('penstyles')
        self.setPalette(QPalette(Qt.white))
        self.setAutoFillBackground(True)
        self.setMinimumSize(100,50)
        
        self.data_idx2d = 1
        self.paintbool = False

        self.connect(self, QtCore.SIGNAL('startpaint()'), self.tochangepaint)
        # # qp.end()

    def tochangepaint(self):
        # This function is called when the view is opened.
        self.paintbool = True
        self.update()

    def paintEvent(self, e):

        
        if self.paintbool == True:

            qp = QtGui.QPainter()
            qp.begin(self)
            self.test_plot2d(qp)
            qp.end()

    def test_plot2d(self, qp):
        dataidx = self.data_idx2d + 1#get_idx()
        # print('Visualization2d: The 2d loop number is: ', dataidx)

        _, pcfiture = showpc.dataset_viz2d(dataidx)
        # print('The length of pcfiture is: ', len(pcfiture))
        pen = QtGui.QPen(QtCore.Qt.blue, 2, QtCore.Qt.SolidLine)

        qp.setPen(pen)
        for i in range(len(pcfiture)):
            x = 20 + i
            y = 100 - 5*pcfiture[i]#40*(1 + pcfiture[i])
            qp.drawLine(x, y, x, 100)

最後是main函式裡的呼叫程式碼:

    te1=Buttonshowfeature()
    te2=Buttontest()  
    self.connect(te2, QtCore.SIGNAL('buttontest()'), te1.topaintonarea)

經測試可以達到想要的效果。