PySide2 視窗控制項分離,並通過主函式呼叫

2021-08-21 09:49:29 字數 2395 閱讀 9814

pyside2 內部中自帶有pydesigner,可以通過它來將部件功能例項化組合達到自己需要的介面。

但是由於將很多不同的控制項組合的過程中,邏輯容易混亂,不利於修改,比較好的一種方式就是生成多個功能不同的控制項(widget),然後在主視窗根據layout 來組合這些控制項,從而能夠清晰自己建立的ui邏輯,便於維護修改。  

比如如果有乙個widget不需要,那麼只需要刪除這個控制項,或者不呼叫就可以了,而不需要在乙個很複雜的py檔案中找出該控制項並修改/刪去。

方法很簡單,也就是在主檔案中,同時生成主視窗和控制項的類,並且將生成的控制項新增在主視窗中。

class myui(qmainwindow,ui_mainwindow):

def __init__(self,parent =none):

super(myui,self).__init__(parent)

self.setupui(self)

self.a = awidget()

self.b = mainwidget()

self.horizontallayout.addwidget(self.a.listwidget_2)

self.horizontallayout.addwidget(self.b)

class mainwidget(qwidget,newtry.helloworld.ui_form):

def __init__(self):

super(mainwidget, self).__init__()

self.setupui(self)

class awidget(qwidget,newtry.widget.ui_form):

def __init__(self):

super(awidget, self).__init__()

self.setupui(self)

(為了**的易操作性,盡可能不要修改由ui轉成的py檔案,另外我們也假設只在主函式中完成簡單的功能,而將絕大多數的呼叫功能分離到另乙個功能實現的檔案中去)

那麼接下來控制項組合中存在的以下數個問題:    

1.如何將兩個不同的控制項通過訊號和槽產生鏈結?

因為控制項的分離,所導致的乙個不太好的後果是,無法在qtdesigner中直接使用訊號和槽函式,而需要自己來定義和呼叫。    

比如乙個listwidget 怎麼通過currentrowchanged(int) 來改變stackedwidget的當前頁面,或者乙個menu的qaction該怎麼和它要完成的動作形成鏈結。    

在這裡可以簡單地對乙個listwidget 和stackedwidget做出乙個鏈結

新建乙個檔案新增類

class funcs(object):

def __init__(self,widget1,widget2):

self.a = widget1

self.b = widget2

def connect(self):

self.a.listwidget_2.currentrowchanged.connect(self.b.stackedwidget.setcurrentindex)

然後在主視窗呼叫這個檔案的類,並且在myui()下新增對該函式的呼叫:

func = 

funcs

(self

.a,self

.b)func.connect

()

2.如何將控制項準確地放在它應處於的位置?    

因為盲目的組合很可能會發生部件的重疊或者無法完整地顯示在視窗中,這裡就需要對layout有乙個深刻的了解。    

結合著vertical layout / horizontal layout  以及spacer  對空間做一些修正,可以在qtdesigner中多加練習。

3.乙個視窗自然要和這個軟體內部實現的功能相結合,比如軟體的資料庫中的內容需要在視窗中顯示,那麼這些功能應該怎麼實現?    

依舊是為了邏輯分明:我們在這裡做出乙個簡單的邏輯梳理

乙個軟體介面中主要的幾個功能塊:    

(1) 多個widget 的組合。    

(2)主介面中實現widget 之間的鏈結,以及介面的按鈕定義動作                   

(3)該軟體主要實現的功能       

每一部分都有聯絡,(1)由(2)鏈結起來,(3)則是通過介面(2)中定義的按鈕,來呼叫軟體的自定義功能。

雖然部件分離了看起來似乎讓乙個ui的實現變得更加困難了,尤其是一些小遊戲,實現的功能並不多,往往在乙個py檔案中就可以實現,但是對於乙個較大的功能比較複雜的軟體,部件分離就顯得尤其有用。

PySide2 視窗退出時處理函式

例如 def close timer self if self.scanning timer none self.scanning timer.cancel if self.polling timer none self.scanning timer.cancel if name main 初始化應...

Pyside2開發環境搭建

pip install index url pyside2 trusted host download.qt.io 要分為三個步驟 開啟qtdesigner繪製視窗 將ui檔案轉換為py檔案供主程式呼叫 主視窗全域性初始化。使用過c 版本qt的老玩家 使用者 都知道,qtdesigner是乙個非常好...

pyside2設計GUI的發布

關於選擇pyside2的原因,裡有詳細說明,也可以參考對應的bilibili鏈結。發布程式需要的pyinstaller pip install pyinstallerpyinstaller f py noconsole hidden import pyside2.qtxml生成三個資料夾和乙個 sp...