> 文章列表 > PYQT5学习笔记03——GUI控件的学习方法以及控件继承关系

PYQT5学习笔记03——GUI控件的学习方法以及控件继承关系

PYQT5学习笔记03——GUI控件的学习方法以及控件继承关系

一、GUI控件的学习方法

  在PyQt5的GUI控件中,不同的控件之间既有相同的功能(共性)又有不同的功能(特性)。

  比如按钮、输入控件、展示控件这三种类型的控件共性就是都可以设置大小、调节位置,按钮的特性是可以点击,输入控件的特性是可以输入内容,展示控件的特性是可以展示内容。又比如单击按钮、单选按钮、复选按钮这三个控件的共性是都可以点击,单击按钮的特性是只能单机,单选按钮的特性是可以单选选择某一个菜单选择,复选按钮可以多选同时选择多个选项。

  由上可知,PyQt5的设计思路是通过类当中的继承机制来实现的。拥有共性的控件继承了同一个父类或者说它的父类继承了同一个父类,共性是从父类继承而来的,而特性是自己实现的多态。所以说控件之间的继承关系可能不止继承一次这么简单。

  所以我们在学习GUI的控件的时候,想要了解一个控件所拥有的方法,需要先了解其父类的方法,再去了解其自己的方法,这样才能学会一个控件。

二、控件继承关系

  PyQt5里面所有的类都是继承自QObject父类,不仅仅是GUI控件继承自该父类,像PyQt5中的网络、文件、数据库等操作类都是继承自该类,我们可以查看QObject有哪些子类,代码如下:

from PyQt5.Qt import *print(QObject.__subclasses__())  # 打印QObject的所有子类

  结果如下:

[<class 'PyQt5.QtCore.QAbstractAnimation'>, <class 'PyQt5.QtCore.QAbstractEventDispatcher'>, <class 'PyQt5.QtCore.QAbstractItemModel'>, <class 'PyQt5.QtCore.QAbstractState'>, <class 'PyQt5.QtCore.QAbstractTransition'>, <class 'PyQt5.QtCore.QIODevice'>, <class 'PyQt5.QtCore.QCoreApplication'>, <class 'PyQt5.QtCore.QEventLoop'>, <class 'PyQt5.QtCore.QFileSelector'>, <class 'PyQt5.QtCore.QFileSystemWatcher'>, <class 'PyQt5.QtCore.QItemSelectionModel'>, <class 'PyQt5.QtCore.QLibrary'>, <class 'PyQt5.QtCore.QMimeData'>, <class 'PyQt5.QtCore.QObjectCleanupHandler'>, <class 'PyQt5.QtCore.QPluginLoader'>, <class 'PyQt5.QtCore.QSettings'>, <class 'PyQt5.QtCore.QSharedMemory'>, <class 'PyQt5.QtCore.QSignalMapper'>, <class 'PyQt5.QtCore.QSocketNotifier'>, <class 'PyQt5.QtCore.QThread'>, <class 'PyQt5.QtCore.QThreadPool'>, <class 'PyQt5.QtCore.QTimeLine'>, <class 'PyQt5.QtCore.QTimer'>, <class 'PyQt5.QtCore.QTranslator'>, <class 'PyQt5.QtCore.QWinEventNotifier'>, <class 'PyQt5.QtNetwork.QAbstractNetworkCache'>, <class 'PyQt5.QtNetwork.QDnsLookup'>, <class 'PyQt5.QtNetwork.QHttpMultiPart'>, <class 'PyQt5.QtNetwork.QLocalServer'>, <class 'PyQt5.QtNetwork.QNetworkAccessManager'>, <class 'PyQt5.QtNetwork.QNetworkConfigurationManager'>, <class 'PyQt5.QtNetwork.QNetworkCookieJar'>, <class 'PyQt5.QtNetwork.QNetworkSession'>, <class 'PyQt5.QtNetwork.QTcpServer'>, <class 'PyQt5.QtXmlPatterns.QAbstractMessageHandler'>, <class 'PyQt5.QtXmlPatterns.QAbstractUriResolver'>, <class 'PyQt5.QtGui.QAbstractTextDocumentLayout'>, <class 'PyQt5.QtGui.QClipboard'>, <class 'PyQt5.QtGui.QValidator'>, <class 'PyQt5.QtGui.QDrag'>, <class 'PyQt5.QtGui.QInputMethod'>, <class 'PyQt5.QtGui.QMovie'>, <class 'PyQt5.QtGui.QOffscreenSurface'>, <class 'PyQt5.QtGui.QOpenGLContext'>, <class 'PyQt5.QtGui.QOpenGLContextGroup'>, <class 'PyQt5.QtGui.QOpenGLDebugLogger'>, <class 'PyQt5.QtGui.QOpenGLShader'>, <class 'PyQt5.QtGui.QOpenGLShaderProgram'>, <class 'PyQt5.QtGui.QOpenGLTimeMonitor'>, <class 'PyQt5.QtGui.QOpenGLTimerQuery'>, <class 'PyQt5.QtGui.QOpenGLVertexArrayObject'>, <class 'PyQt5.QtGui.QWindow'>, <class 'PyQt5.QtGui.QPdfWriter'>, <class 'PyQt5.QtGui.QScreen'>, <class 'PyQt5.QtGui.QSessionManager'>, <class 'PyQt5.QtGui.QStyleHints'>, <class 'PyQt5.QtGui.QSyntaxHighlighter'>, <class 'PyQt5.QtGui.QTextObject'>, <class 'PyQt5.QtGui.QTextDocument'>, <class 'PyQt5.QtWidgets.QWidget'>, <class 'PyQt5.QtWidgets.QAbstractItemDelegate'>, <class 'PyQt5.QtWidgets.QAction'>, <class 'PyQt5.QtWidgets.QActionGroup'>, <class 'PyQt5.QtWidgets.QLayout'>, <class 'PyQt5.QtWidgets.QButtonGroup'>, <class 'PyQt5.QtWidgets.QStyle'>, <class 'PyQt5.QtWidgets.QCompleter'>, <class 'PyQt5.QtWidgets.QDataWidgetMapper'>, <class 'PyQt5.QtWidgets.QGesture'>, <class 'PyQt5.QtWidgets.QGraphicsAnchor'>, <class 'PyQt5.QtWidgets.QGraphicsEffect'>, <class 'PyQt5.QtWidgets.QGraphicsObject'>, <class 'PyQt5.QtWidgets.QGraphicsTransform'>, <class 'PyQt5.QtWidgets.QGraphicsScene'>, <class 'PyQt5.QtWidgets.QScroller'>, <class 'PyQt5.QtWidgets.QShortcut'>, <class 'PyQt5.QtWidgets.QSystemTrayIcon'>, <class 'PyQt5.QtWidgets.QUndoGroup'>, <class 'PyQt5.QtWidgets.QUndoStack'>, <class 'PyQt5.QtWinExtras.QWinJumpList'>, <class 'PyQt5.QtWinExtras.QWinTaskbarButton'>, <class 'PyQt5.QtWinExtras.QWinTaskbarProgress'>, <class 'PyQt5.QtWinExtras.QWinThumbnailToolBar'>, <class 'PyQt5.QtWinExtras.QWinThumbnailToolButton'>, <class 'PyQt5.QtWebSockets.QMaskGenerator'>, <class 'PyQt5.QtWebSockets.QWebSocket'>, <class 'PyQt5.QtWebSockets.QWebSocketServer'>, <class 'PyQt5.QtWebChannel.QWebChannel'>, <class 'PyQt5.QtWebChannel.QWebChannelAbstractTransport'>, <class 'PyQt5.QtTextToSpeech.QTextToSpeech'>, <class 'PyQt5.QtTest.QAbstractItemModelTester'>, <class 'PyQt5.QtTest.QSignalSpy'>, <class 'PyQt5.QtSvg.QSvgRenderer'>, <class 'PyQt5.QtSql.QSqlDriver'>, <class 'PyQt5.QtSensors.QSensor'>, <class 'PyQt5.QtSensors.QSensorReading'>, <class 'PyQt5.QtRemoteObjects.QRemoteObjectAbstractPersistedStore'>, <class 'PyQt5.QtRemoteObjects.QRemoteObjectReplica'>, <class 'PyQt5.QtRemoteObjects.QRemoteObjectNode'>, <class 'PyQt5.QtQml.QJSEngine'>, <class 'PyQt5.QtQml.QQmlComponent'>, <class 'PyQt5.QtQml.QQmlContext'>, <class 'PyQt5.QtQml.QQmlEngineExtensionPlugin'>, <class 'PyQt5.QtQml.QQmlExpression'>, <class 'PyQt5.QtQml.QQmlExtensionPlugin'>, <class 'PyQt5.QtQml.QQmlFileSelector'>, <class 'PyQt5.QtQml.QQmlPropertyMap'>, <class 'PyQt5.QtQuick.QQuickItem'>, <class 'PyQt5.QtQuick.QQuickImageResponse'>, <class 'PyQt5.QtQuick.QQuickItemGrabResult'>, <class 'PyQt5.QtQuick.QQuickRenderControl'>, <class 'PyQt5.QtQuick.QQuickTextDocument'>, <class 'PyQt5.QtQuick.QQuickTextureFactory'>, <class 'PyQt5.QtQuick.QSGAbstractRenderer'>, <class 'PyQt5.QtQuick.QSGTexture'>, <class 'PyQt5.QtQuick.QSGEngine'>, <class 'PyQt5.QtQuick.QSGTextureProvider'>, <class 'PyQt5.QtQuick3D.QQuick3DObject'>, <class 'PyQt5.QtPositioning.QGeoAreaMonitorSource'>, <class 'PyQt5.QtPositioning.QGeoPositionInfoSource'>, <class 'PyQt5.QtPositioning.QGeoSatelliteInfoSource'>, <class 'PyQt5.QtLocation.QGeoCodeReply'>, <class 'PyQt5.QtLocation.QGeoCodingManager'>, <class 'PyQt5.QtLocation.QGeoCodingManagerEngine'>, <class 'PyQt5.QtLocation.QGeoRouteReply'>, <class 'PyQt5.QtLocation.QGeoRoutingManager'>, <class 'PyQt5.QtLocation.QGeoRoutingManagerEngine'>, <class 'PyQt5.QtLocation.QGeoServiceProvider'>, <class 'PyQt5.QtLocation.QPlaceReply'>, <class 'PyQt5.QtLocation.QPlaceManager'>, <class 'PyQt5.QtLocation.QPlaceManagerEngine'>, <class 'PyQt5.QtNfc.QNearFieldManager'>, <class 'PyQt5.QtNfc.QNearFieldShareManager'>, <class 'PyQt5.QtNfc.QNearFieldShareTarget'>, <class 'PyQt5.QtNfc.QNearFieldTarget'>, <class 'PyQt5.QtNfc.QQmlNdefRecord'>, <class 'PyQt5.QtMultimedia.QAbstractVideoFilter'>, <class 'PyQt5.QtMultimedia.QAbstractVideoSurface'>, <class 'PyQt5.QtMultimedia.QMediaObject'>, <class 'PyQt5.QtMultimedia.QMediaControl'>, <class 'PyQt5.QtMultimedia.QAudioInput'>, <class 'PyQt5.QtMultimedia.QAudioOutput'>, <class 'PyQt5.QtMultimedia.QAudioProbe'>, <class 'PyQt5.QtMultimedia.QMediaRecorder'>, <class 'PyQt5.QtMultimedia.QCameraExposure'>, <class 'PyQt5.QtMultimedia.QCameraFocus'>, <class 'PyQt5.QtMultimedia.QCameraImageCapture'>, <class 'PyQt5.QtMultimedia.QCameraImageProcessing'>, <class 'PyQt5.QtMultimedia.QMediaPlaylist'>, <class 'PyQt5.QtMultimedia.QMediaService'>, <class 'PyQt5.QtMultimedia.QRadioData'>, <class 'PyQt5.QtMultimedia.QSound'>, <class 'PyQt5.QtMultimedia.QSoundEffect'>, <class 'PyQt5.QtMultimedia.QVideoProbe'>, <class 'PyQt5.QtHelp.QHelpEngineCore'>, <class 'PyQt5.QtHelp.QHelpFilterEngine'>, <class 'PyQt5.QtHelp.QHelpSearchEngine'>, <class 'PyQt5.QtDesigner.QDesignerFormEditorInterface'>, <class 'PyQt5.QtDesigner.QDesignerFormWindowManagerInterface'>, <class 'PyQt5.QtDesigner.QExtensionFactory'>, <class 'PyQt5.QtDesigner.QExtensionManager'>, <class 'PyQt5.QtDesigner.QPyDesignerContainerExtension'>, <class 'PyQt5.QtDesigner.QPyDesignerCustomWidgetCollectionPlugin'>, <class 'PyQt5.QtDesigner.QPyDesignerCustomWidgetPlugin'>, <class 'PyQt5.QtDesigner.QPyDesignerMemberSheetExtension'>, <class 'PyQt5.QtDesigner.QPyDesignerPropertySheetExtension'>, <class 'PyQt5.QtDesigner.QPyDesignerTaskMenuExtension'>, <class 'PyQt5.QtDBus.QDBusAbstractAdaptor'>, <class 'PyQt5.QtDBus.QDBusAbstractInterface'>, <class 'PyQt5.QtDBus.QDBusPendingCallWatcher'>, <class 'PyQt5.QtDBus.QDBusServiceWatcher'>, <class 'PyQt5.QtBluetooth.QBluetoothDeviceDiscoveryAgent'>, <class 'PyQt5.QtBluetooth.QBluetoothLocalDevice'>, <class 'PyQt5.QtBluetooth.QBluetoothServer'>, <class 'PyQt5.QtBluetooth.QBluetoothServiceDiscoveryAgent'>, <class 'PyQt5.QtBluetooth.QBluetoothTransferManager'>, <class 'PyQt5.QtBluetooth.QBluetoothTransferReply'>, <class 'PyQt5.QtBluetooth.QLowEnergyController'>, <class 'PyQt5.QtBluetooth.QLowEnergyService'>, <class 'PyQt5.QAxContainer.QAxObject'>]

  可以看到,它的子类有非常多,但是有关GUI控件的子类只有一个,那就是可视化QWidgetQWidget是所有GUI控件的父类,比如所有的按钮、标签等都是它的子类。我们可以打印一下它的子类,代码如下:

from PyQt5.Qt import *print(QWidget.__subclasses__())  # QWidget的所有子类

  结果如下:

[<class 'PyQt5.QtWidgets.QAbstractButton'>, <class 'PyQt5.QtWidgets.QFrame'>, <class 'PyQt5.QtWidgets.QAbstractSlider'>, <class 'PyQt5.QtWidgets.QAbstractSpinBox'>, <class 'PyQt5.QtWidgets.QCalendarWidget'>, <class 'PyQt5.QtWidgets.QDialog'>, <class 'PyQt5.QtWidgets.QComboBox'>, <class 'PyQt5.QtWidgets.QDesktopWidget'>, <class 'PyQt5.QtWidgets.QDialogButtonBox'>, <class 'PyQt5.QtWidgets.QDockWidget'>, <class 'PyQt5.QtWidgets.QFocusFrame'>, <class 'PyQt5.QtWidgets.QGroupBox'>, <class 'PyQt5.QtWidgets.QKeySequenceEdit'>, <class 'PyQt5.QtWidgets.QLineEdit'>, <class 'PyQt5.QtWidgets.QMainWindow'>, <class 'PyQt5.QtWidgets.QMdiSubWindow'>, <class 'PyQt5.QtWidgets.QMenu'>, <class 'PyQt5.QtWidgets.QMenuBar'>, <class 'PyQt5.QtWidgets.QOpenGLWidget'>, <class 'PyQt5.QtWidgets.QProgressBar'>, <class 'PyQt5.QtWidgets.QRubberBand'>, <class 'PyQt5.QtWidgets.QSizeGrip'>, <class 'PyQt5.QtWidgets.QSplashScreen'>, <class 'PyQt5.QtWidgets.QSplitterHandle'>, <class 'PyQt5.QtWidgets.QStatusBar'>, <class 'PyQt5.QtWidgets.QTabBar'>, <class 'PyQt5.QtWidgets.QTabWidget'>, <class 'PyQt5.QtWidgets.QToolBar'>, <class 'PyQt5.QtWidgets.QWizardPage'>, <class 'PyQt5.QtSvg.QSvgWidget'>, <class 'PyQt5.QtQuickWidgets.QQuickWidget'>, <class 'PyQt5.QtPrintSupport.QPrintPreviewWidget'>, <class 'PyQt5.QtOpenGL.QGLWidget'>, <class 'PyQt5.QtMultimediaWidgets.QVideoWidget'>, <class 'PyQt5.QtHelp.QHelpFilterSettingsWidget'>, <class 'PyQt5.QtHelp.QHelpSearchQueryWidget'>, <class 'PyQt5.QtHelp.QHelpSearchResultWidget'>, <class 'PyQt5.QtDesigner.QDesignerActionEditorInterface'>, <class 'PyQt5.QtDesigner.QDesignerFormWindowInterface'>, <class 'PyQt5.QtDesigner.QDesignerObjectInspectorInterface'>, <class 'PyQt5.QtDesigner.QDesignerPropertyEditorInterface'>, <class 'PyQt5.QtDesigner.QDesignerWidgetBoxInterface'>, <class 'PyQt5.QAxContainer.QAxWidget'>]

  其中就有一些我们常见的控件类,比如QAbstractButtonQFrame等。我们打印一下QAbstractButton的所有子类,代码如下:

from PyQt5.Qt import *print(QAbstractButton.__subclasses__())

  结果如下:

[<class 'PyQt5.QtWidgets.QCheckBox'>, <class 'PyQt5.QtWidgets.QPushButton'>, <class 'PyQt5.QtWidgets.QRadioButton'>, <class 'PyQt5.QtWidgets.QToolButton'>]

  这就是我们刚刚说的单选按钮、单击按钮和复选按钮,现在他们以及他们的父类的继承结构都非常清楚了。QObject -> QWidget -> QAbstractButton ->QPushButton,其中QObject 提供PyQt5中类的一下属性,QWidget 提供位置、大小等属性,QAbstractButton 提供点击的属性,QPushButton提供单击的属性。

  如果像这样一层一层的学习控件的话,结构十分清晰,思路十分清楚,值得借鉴!!!