在以前學習QT的時候,這個是在網(wǎng)上看到有大神做這個的演示給大家來學。覺得很有趣,而且,正是在這個程序的幫助下,我理解了QT的信號與槽的機制。相信,在寫這個代碼,會幫助到不少對于信號與槽還有些許不了解的朋友們

聯(lián)動器
聯(lián)動器設計基礎
這里有四個東西。
- 一個水平的橫軸(可以拖動)
- 一個豎直的軸(也可以拖動)
- 一個Dial(刻度盤,可以轉(zhuǎn)動的)
- 一個double spin box(浮點數(shù)的可以動盒子)
就是在使用的時候,只要改變了一個就會把其他都改變。
比如,以下的圖片

轉(zhuǎn)了一下

把鼠標移到浮點數(shù)部分,滾動了一下鼠標滾輪
聯(lián)動器設計關鍵函數(shù)
下面這四句話
self.doubleSpinBox.valueChanged.connect(lambda:self.verticalSlider.setValue(self.doubleSpinBox.value()))
self.verticalSlider.valueChanged.connect(lambda:self.horizontalSlider.setValue(self.verticalSlider.value()))
self.horizontalSlider.valueChanged.connect(lambda: self.dial.setValue(self.horizontalSlider.value()))
self.dial.valueChanged.connect(lambda : self.doubleSpinBox.setValue(self.dial.value()))
表示的意思就是,只要一個變了數(shù)值,就會把另外一個的數(shù)值改動。這樣順著改下去,就把所有的都改動了。
至于這里的lambda : 為什么要這么寫? 我之前已經(jīng)在第一篇最簡單的pyQT5入門中講過了,類比于c++ QT中的SLOT(),當然也可以用裝飾器來做。
為什么說這個程序可以幫助人理解關于“信號與槽”的機制?
- 這里,看到了由于一個數(shù)據(jù)的改變,而觸發(fā)了另外一個函數(shù)的啟動。
- 反反復復地相互觸發(fā),體會到信號與槽機制的有趣(符合人的思維的設計)
至于上面的那四句代碼,還是比較好理解的
(老規(guī)矩,下面代碼可以直接運行。只要你是下好了那些庫(pip install 嘿嘿))
全部代碼在這個里(這次比上次多了一個"設置框體的標題,留心的朋友,可以收獲到這個知識點")
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'valueChange.ui'
#
# Created by: PyQt5 UI code generator 5.10
#
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(759, 339)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.dial = QtWidgets.QDial(self.centralwidget)
self.dial.setGeometry(QtCore.QRect(30, 60, 251, 231))
self.dial.setObjectName("dial")
self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider.setGeometry(QtCore.QRect(70, 20, 221, 31))
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName("horizontalSlider")
self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget)
self.doubleSpinBox.setGeometry(QtCore.QRect(460, 80, 191, 151))
self.doubleSpinBox.setObjectName("doubleSpinBox")
self.verticalSlider = QtWidgets.QSlider(self.centralwidget)
self.verticalSlider.setGeometry(QtCore.QRect(330, 70, 22, 211))
self.verticalSlider.setOrientation(QtCore.Qt.Vertical)
self.verticalSlider.setObjectName("verticalSlider")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
self.doubleSpinBox.valueChanged.connect(lambda:self.verticalSlider.setValue(self.doubleSpinBox.value()))
self.verticalSlider.valueChanged.connect(lambda:self.horizontalSlider.setValue(self.verticalSlider.value()))
self.horizontalSlider.valueChanged.connect(lambda: self.dial.setValue(self.horizontalSlider.value()))
self.dial.valueChanged.connect(lambda : self.doubleSpinBox.setValue(self.dial.value()))
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
if __name__ == '__main__':
app = QApplication(sys.argv)
mainwindow = QMainWindow()
uiWindows = Ui_MainWindow()
uiWindows.setupUi(mainwindow)
mainwindow.setWindowTitle("Changer")
mainwindow.show()
sys.exit(app.exec_())
pass