pyqt的setObjectName()/findChild()


 

根據設置的Name標示查找組件的對象,關鍵函數:setObjectName()/findChild()

 

findChild()/2:需要兩個參數,

  參數一:組件的類型,如QLineEdit、QPushButton。

  參數二:setObjectName()設置的Name標示。

 

個人注解:

  背景描述:

    目前屬於初級階段,各種了解都不太全面。

  場景描述:

        一個widget容器(視為parent)通過設置layout添加了很多組件,比如button,input,

      通過設置parent.button_1,parent.input_2保存對象,容器中的組件多了很亂的,比如某個事件觸發了需要獲取多個input.text(),

      現階段掌握的知識只能通過parent.input_1.text()、parent.input_2.text()、parent.input_3.text()獲取.

 

改進方案:

  ①、如果能建立各個組件的Name標示和組件的類型的映射關系,則可直接通過findChild(map_nameId_type,nameId)找到組件。

  ②、直接建立組件對象NameId和組件對象的映射,map(key-value),只占用widget的自定義子類的類型為dictionary一個屬性,

                  (在寫方案①的時候想到的,原始方案太挫了、、、、突然有點喜歡上python的弱類型,Java的強類型的思維模式習慣了)

 

 

from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QHBoxLayout, 
                                        QLineEdit)
from PyQt5.QtGui import *  
from PyQt5.QtCore import *  
import sys  


def clickHandle():
    #button = main.sender()
    #print(button.objectName())
    
    array = []
    array.append(QLineEdit)
     #根據名字獲取組件
    obj = main.findChild(array[0],"edit_1")
    print(type(obj))
    print(isinstance(obj, QLineEdit))
    print(isinstance(obj, array[0]))
    
    print(main.findChild(array[0],"edit_1").text())
   
    print(main.findChild(QLineEdit,"edit_1").text())
    print(edit_1.text())


if __name__ == '__main__':                   
    app=QApplication(sys.argv)  
    main=QWidget()  
    
    latout = QHBoxLayout()
    main.setLayout(latout)
    
    but_1 = QPushButton('but_1')
    but_1.setObjectName('but_1')
    but_1.clicked.connect(clickHandle)
    but_2 = QPushButton('but_2')
    but_2.setObjectName('but_2')
    but_2.clicked.connect(clickHandle)
    
    edit_1 = QLineEdit()
    edit_1.setObjectName('edit_1')
    
    edit_2 = QLineEdit()
    edit_2.setObjectName('edit_2')
    
    latout.addWidget(but_1)
    latout.addWidget(but_2)
    
    latout.addWidget(edit_1)
    latout.addWidget(edit_2)
    
    main.show()  
    app.exec_()

 

 

方案②、

from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QHBoxLayout, 
                                        QLineEdit)
from PyQt5.QtGui import *  
from PyQt5.QtCore import *  
import sys  


def clickHandle():
    #button = main.sender()
    #print(button.objectName())
    
    array = []
    array.append(QLineEdit)
     #根據名字獲取組件
    obj = main.findChild(array[0],"edit_1")
    print(type(obj))
    print(isinstance(obj, QLineEdit))
    print(isinstance(obj, array[0]))
    
    print(main.findChild(array[0],"edit_1").text())
   
    print(main.findChild(QLineEdit,"edit_1").text())
    print(edit_1.text())
    print(array_obj[2].text())
    print(array_obj[3].text())


if __name__ == '__main__':                   
    app=QApplication(sys.argv)  
    main=QWidget()  
    
    array_obj = []
    latout = QHBoxLayout()
    main.setLayout(latout)
    
    but_1 = QPushButton('but_1')
    but_1.setObjectName('but_1')
    but_1.clicked.connect(clickHandle)
    but_2 = QPushButton('but_2')
    but_2.setObjectName('but_2')
    but_2.clicked.connect(clickHandle)
    
    array_obj.append(but_1)
    array_obj.append(but_2)
    
    edit_1 = QLineEdit()
    edit_1.setObjectName('edit_1')
    
    edit_2 = QLineEdit()
    edit_2.setObjectName('edit_2')

    array_obj.append(edit_1)  
    array_obj.append(edit_2)
  
    latout.addWidget(but_1)
    latout.addWidget(but_2)
    
    latout.addWidget(edit_1)
    latout.addWidget(edit_2)
    
    main.show()  
    app.exec_()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM