PySide2:窗口控件分离,并通过主函数调用

       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)