1. 程式人生 > >使用Qt Designer

使用Qt Designer

    使用Qt Designer

Qt Designer是用於設計和構建圖形使用者介面的Qt工具。它允許您使用螢幕表單和簡單的拖放介面設計視窗小部件,對話方塊或完整的主視窗。它能夠預覽您的設計,以確保它們按照您的意圖工作,並允許您在編寫任何程式碼之前與您的使用者進行原型設計。

Qt Designer使用XML .ui檔案儲存設計,並不自行生成任何程式碼。Qt包括uic生成用於建立使用者介面的C ++程式碼的實用程式。Qt還包括QUiLoader允許應用程式載入.ui檔案並動態建立相應使用者介面的類。

PyQt5不包裝QUiLoader類,而是包含 

uic Python模組。像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.compileUiUIFILEpyfile [,執行=假[,縮排= 4 [,from_imports =假[,resource_suffix = '_ RC' [,IMPORT_FROM = '' ] ] ] ] ] )

生成一個Python模組,該模組將從Qt Designer .ui檔案建立使用者介面。

引數:
  • uifile - 包含該.ui檔案的檔名或類檔案物件。
  • pyfile - 生成的Python程式碼將寫入的類檔案物件。
  • execute - 如果要生成少量額外程式碼,則可選擇設定,如果程式碼作為獨立應用程式執行,將顯示使用者介面。
  • indent - 生成的程式碼中用於縮排的可選空格數。如果為零,則使用製表符。
  • from_imports - 可選地設定為生成相對import語句。目前,這僅適用於資源模組的匯入。
  • import_from - 可選地設定為用於相對import語句的包。預設是'.'
Resource_suffix:
 

是附加到檔案中指定的任何資原始檔的基名的字尾,.ui用於建立從資原始檔生成的Python模組的名稱pyrcc5。預設是'_rc',即如果.ui檔案指定了一個被呼叫的資原始檔,foo.qrc那麼相應的Python模組就是foo_rc

PyQt5.uic.compileUiDirdir [,recurse = False [,map = None [,** compileUi_args ] ] ] )

.ui目錄或目錄樹中的Qt Designer 檔案建立Python模組。

引數:
  • dir - 要掃描名稱以其結尾的檔案的目錄的名稱 .ui。預設情況下,生成的Python模組在以.py。結尾的同一目錄中建立。
  • recurse - 如果應掃描任何子目錄,則可選擇設定。
  • map - 一個可選的可呼叫物件,它傳遞包含該.ui檔案的目錄的名稱以及將要建立的Python模組的名稱。callable應該返回一個元組,該元組將在其中建立Python模組的目錄名稱和模組的(可能已修改的)名稱。
  • compileUi_args - 傳遞給compileUi()它的任何其他關鍵字引數, 用於建立每個Python模組。

PyQt5.uic.loadUiTypeuifile [,from_imports = False [,resource_suffix ='_ rc' [,import_from ='。' ] ] ] )

載入Qt Designer .ui檔案並返回生成的表單類Qt基類的元組 。然後,這些可以用於建立任意數量的使用者介面例項,而不必.ui多次解析檔案。

引數:
  • uifile - 包含該.ui檔案的檔名或類檔案物件。
  • from_imports - 可選地設定為生成相對import語句。目前,這僅適用於資源模組的匯入。
  • import_from - 可選地設定為用於相對import語句的包。預設是'.'
Resource_suffix:
 

是附加到檔案中指定的任何資原始檔的基名的字尾,.ui用於建立從資原始檔生成的Python模組的名稱pyrcc5。預設是'_rc',即如果.ui檔案指定了一個被呼叫的資原始檔,foo.qrc那麼相應的Python模組就是foo_rc

返回型別:

形式類Qt的基類

PyQt5.uic.loadUiUIFILE [,baseinstance =無[,包= '' [,resource_suffix = '_ RC' ] ] ] )

載入Qt Designer .ui檔案並返回使用者介面的例項。

引數:
  • uifile - 包含該.ui檔案的檔名或類檔案物件。
  • baseinstance - Qt基類的可選例項。如果指定,則在其中建立使用者介面。否則,將自動建立基類的新例項。
  • package - 可選包,它是任何相對匯入的自定義小部件的基礎包。
Resource_suffix:
 

是附加到檔案中指定的任何資原始檔的基名的字尾,.ui用於建立從資原始檔生成的Python模組的名稱pyrcc5。預設是'_rc',即如果.ui檔案指定了一個被呼叫的資原始檔,foo.qrc那麼相應的Python模組就是foo_rc

返回型別:

QWidget實現使用者介面的子類。

   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中進行子類化, 而QDesignerCustomWidgetInterfacePython自定義視窗小部件外掛將改為從QPyDesignerCustomWidgetPlugin進行子類 

  • PyQt5在Designer的外掛目錄中安裝了一個C ++外掛。它符合QDesignerCustomWidgetCollectionInterface 類定義的介面。它搜尋一組可配置的目錄,查詢實現從QPyDesignerCustomWidgetPlugin分類的類的Python外掛。找到的每個類都被例項化,並且建立的例項將新增到自定義視窗小部件集合中。

    該 PYQTDESIGNERPATHenvironment變數指定要搜尋外掛的目錄集。目錄名稱由路徑分隔符分隔(Windows上的分號和其他平臺上的冒號)。如果目錄名稱為空(即,存在連續的路徑分隔符或前導或尾隨路徑分隔符),則會在該點自動插入一組預設目錄。預設目錄是pythonDesigner搜尋其自己的外掛的每個目錄的 子目錄。如果未設定環境變數,則僅搜尋預設目錄。如果檔案的基本名稱沒有結束,plugin 則忽略它。

  • Python自定義小部件可以使用定義新的Qt訊號 pyqtSignal()

  • 可以使用pyqtSlot()裝飾器將Python方法定義為新的Qt槽 。

  • 可以使用該pyqtProperty() 函式定義新的Qt屬性。

請注意,從Python定義新的Qt訊號,插槽和屬性的能力對於符合任何外掛介面的外掛而言可能是有用的,而不僅僅是Designer使用的外掛。

有關定義新Qt訊號,插槽和屬性及其外掛的自定義視窗小部件的簡單但完整且完整記錄的示例,請檢視examples/designer/pluginsPyQt5源包的 目錄。該 widgets子目錄包含pydemo.py自定義部件和python子目錄包含它的pydemoplugin.py外掛。