使用Qt Designer
使用Qt Designer
Qt Designer是用於設計和構建圖形使用者介面的Qt工具。它允許您使用螢幕表單和簡單的拖放介面設計視窗小部件,對話方塊或完整的主視窗。它能夠預覽您的設計,以確保它們按照您的意圖工作,並允許您在編寫任何程式碼之前與您的使用者進行原型設計。
Qt Designer使用XML .ui
檔案儲存設計,並不自行生成任何程式碼。Qt包括uic
生成用於建立使用者介面的C ++程式碼的實用程式。Qt還包括QUiLoader
允許應用程式載入.ui
檔案並動態建立相應使用者介面的類。
PyQt5不包裝QUiLoader
類,而是包含 QUiLoader
這個模組可以載入 .ui
檔案來動態建立使用者介面。與uic 實用程式一樣,它也可以生成將建立使用者介面的Python程式碼。PyQt5的pyuic5實用程式是uic模組的命令列介面。兩者都在以下部分中詳細描述。
使用生成的程式碼
生成的程式碼與Qt生成的程式碼具有相同的結構, uic
並且可以以相同的方式使用。
程式碼結構化為從Python object
型別派生的單個類 。類的名稱是在Designer中設定的頂層物件的名稱Ui_
。(在C ++版本中,類在Ui
該類包含一個名為的方法setupUi()
。這需要一個引數,即建立使用者介面的小部件。此引數的型別(通常為QDialog, QWidget或 QMainWindow)在Designer中設定。我們將此型別稱為Qt基類。
在以下示例中,我們假設.ui
已建立包含對話方塊的檔案,並且QDialog 物件的名稱為ImageDialog
。我們還假設包含生成的Python程式碼的檔案的名稱是ui_imagedialog.py
。然後可以以多種方式使用生成的程式碼。
第一個示例顯示了直接方法,我們只需建立一個簡單的應用程式來建立對話方塊:
import sys
from PyQt5.QtWidgets import QApplication, QDialog
from ui_imagedialog import Ui_ImageDialog
app = QApplication(sys.argv)
window = QDialog()
ui = Ui_ImageDialog()
ui.setupUi(window)
window.show()
sys.exit(app.exec_())
第二個示例顯示了單繼承方法,其中我們子類 QDialog並在__init__()
方法中設定使用者介面 :
from PyQt5.QtWidgets import QDialog
from ui_imagedialog import Ui_ImageDialog
class ImageDialog(QDialog):
def __init__(self):
super(ImageDialog, self).__init__()
# Set up the user interface from Designer.
self.ui = Ui_ImageDialog()
self.ui.setupUi(self)
# Make some local modifications.
self.ui.colorDepthCombo.addItem("2 colors (1 bit per pixel)")
# Connect up the buttons.
self.ui.okButton.clicked.connect(self.accept)
self.ui.cancelButton.clicked.connect(self.reject)
最後一個示例顯示了多繼承方法:
from PyQt5.QtGui import QDialog
from ui_imagedialog import Ui_ImageDialog
class ImageDialog(QDialog, Ui_ImageDialog):
def __init__(self):
super(ImageDialog, self).__init__()
# Set up the user interface from Designer.
self.setupUi(self)
# Make some local modifications.
self.colorDepthCombo.addItem("2 colors (1 bit per pixel)")
# Connect up the buttons.
self.okButton.clicked.connect(self.accept)
self.cancelButton.clicked.connect(self.reject)
有關完整說明,請參閱Qt文件中的Qt Designer手冊。
在UIC模組
在UIC模組包含以下功能和物件。
PyQt5.uic.widgetPluginPath
搜尋視窗小部件外掛的目錄列表。最初它包含包含PyQt5附帶的小部件外掛的目錄的名稱。
PyQt5.uic.compileUi
(UIFILE,pyfile [,執行=假[,縮排= 4 [,from_imports =假[,resource_suffix = '_ RC' [,IMPORT_FROM = '' ] ] ] ] ] )
生成一個Python模組,該模組將從Qt Designer .ui
檔案建立使用者介面。
引數: |
|
---|---|
Resource_suffix: | |
是附加到檔案中指定的任何資原始檔的基名的字尾, |
PyQt5.uic.compileUiDir
(dir [,recurse = False [,map = None [,** compileUi_args ] ] ] )
從.ui
目錄或目錄樹中的Qt Designer 檔案建立Python模組。
引數: |
|
---|
PyQt5.uic.loadUiType
(uifile [,from_imports = False [,resource_suffix ='_ rc' [,import_from ='。' ] ] ] )
載入Qt Designer .ui
檔案並返回生成的表單類和Qt基類的元組 。然後,這些可以用於建立任意數量的使用者介面例項,而不必.ui
多次解析檔案。
引數: |
|
---|---|
Resource_suffix: | |
是附加到檔案中指定的任何資原始檔的基名的字尾, |
|
返回型別: | 的形式類和Qt的基類。 |
PyQt5.uic.loadUi
(UIFILE [,baseinstance =無[,包= '' [,resource_suffix = '_ RC' ] ] ] )
載入Qt Designer .ui
檔案並返回使用者介面的例項。
引數: |
|
---|---|
Resource_suffix: | |
是附加到檔案中指定的任何資原始檔的基名的字尾, |
|
返回型別: |
|
pyuic5
所述pyuic5實用程式是一個命令列介面 UIC模組。該命令具有以下語法:
pyuic5 [options] .ui-file
完整的命令列選項是:
-h, --help
寫入幫助訊息stdout
。
--version
版本號寫入stdout
。
-i
<N>
,
--indent
<N>
Python程式碼是使用<N>
空格縮排生成的。如果 <N>
為0則使用選項卡。預設值為4。
-o
<FILE>
,
--output
<FILE>
生成的Python程式碼將寫入該檔案<FILE>
。
-p
,
--preview
GUI是動態建立並顯示的。沒有生成Python程式碼。
-x
,
--execute
生成的Python程式碼包含少量附加程式碼,這些程式碼在作為獨立應用程式執行時建立並顯示GUI。
--import-from
<PACKAGE>
5.6版中的新功能。
資源模組是使用而不是簡單匯入的。from <PACKAGE> import ...
import ...
--from-imports
這相當於指定。--import-from .
--resource-suffix
<SUFFIX>
字尾<SUFFIX>
附加到檔案中指定的任何資原始檔.ui
的基名,以建立pyrcc5從資原始檔生成的Python模組的名稱。預設是 _rc
。例如,如果.ui
檔案指定了一個被呼叫的資原始檔, foo.qrc
那麼相應的Python模組就是foo_rc
。
請注意,pyuic5生成的程式碼不保證與早期版本的PyQt5相容。但是,它保證與更高版本相容。如果您無法控制PyQt5的版本,那麼您的應用程式的使用者正在使用,那麼您應該在安裝過程中執行 pyuic5或呼叫compileUi()
。另一種方法是分發.ui
檔案(可能作為資原始檔的一部分)並讓您的應用程式動態載入它們。
編寫Qt Designer外掛
Qt Designer可以通過編寫外掛來擴充套件。通常這是使用C ++完成的,但PyQt5也允許你用Python編寫外掛。大多數情況下,外掛用於向Designer公開自定義視窗小部件,以便它像任何其他視窗小部件一樣顯示在Designer的視窗小部件框中。可以更改視窗小部件的屬性並連線其訊號和插槽。
也可以向Designer新增新功能。有關完整詳細資訊,請參閱Qt文件。在這裡,我們將集中描述如何在Python中編寫自定義小部件。
將Python自定義小部件與Designer整合的過程與使用C ++編寫的小部件非常相似。但是,有一些特殊問題需要解決。
- Designer需要一個符合
QDesignerCustomWidgetInterface
該類定義的介面的C ++外掛。(如果外掛公開了多個自定義視窗小部件,那麼它必須符合QDesignerCustomWidgetCollectionInterface
該類定義的介面 。)此外,外掛類必須是子類QObject以及介面類。PyQt5不允許Python類從多個Qt類中進行子類化。 - Designer只能連線Qt訊號和插槽。它不瞭解Python訊號或callables。
- Designer只能編輯代表C ++型別的Qt屬性。它不瞭解Python屬性或Python型別。
PyQt5提供以下元件和功能,以儘可能簡單地解決這些問題。
-
PyQt5的QtDesigner模組包含
QPy
已經從必要的Qt類中細分的其他類(所有這些類都有 字首)。這避免了在Python中使用多個Qt類進行子類化的需要。例如,C ++自定義視窗小部件外掛將從QObject中進行子類化, 而QDesignerCustomWidgetInterface
Python自定義視窗小部件外掛將改為從QPyDesignerCustomWidgetPlugin進行子類 化。 -
PyQt5在Designer的外掛目錄中安裝了一個C ++外掛。它符合
QDesignerCustomWidgetCollectionInterface
類定義的介面。它搜尋一組可配置的目錄,查詢實現從QPyDesignerCustomWidgetPlugin分類的類的Python外掛。找到的每個類都被例項化,並且建立的例項將新增到自定義視窗小部件集合中。該
PYQTDESIGNERPATH
environment變數指定要搜尋外掛的目錄集。目錄名稱由路徑分隔符分隔(Windows上的分號和其他平臺上的冒號)。如果目錄名稱為空(即,存在連續的路徑分隔符或前導或尾隨路徑分隔符),則會在該點自動插入一組預設目錄。預設目錄是python
Designer搜尋其自己的外掛的每個目錄的 子目錄。如果未設定環境變數,則僅搜尋預設目錄。如果檔案的基本名稱沒有結束,plugin
則忽略它。 -
Python自定義小部件可以使用定義新的Qt訊號
pyqtSignal()
。 -
可以使用
pyqtSlot()
裝飾器將Python方法定義為新的Qt槽 。 -
可以使用該
pyqtProperty()
函式定義新的Qt屬性。
請注意,從Python定義新的Qt訊號,插槽和屬性的能力對於符合任何外掛介面的外掛而言可能是有用的,而不僅僅是Designer使用的外掛。
有關定義新Qt訊號,插槽和屬性及其外掛的自定義視窗小部件的簡單但完整且完整記錄的示例,請檢視examples/designer/plugins
PyQt5源包的 目錄。該 widgets
子目錄包含pydemo.py
自定義部件和python
子目錄包含它的pydemoplugin.py
外掛。