zoukankan      html  css  js  c++  java
  • 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_()
    
  • 相关阅读:
    oracle中Blob和Clob类型的区别
    为什么要分库分表
    Enable file editing in Visual Studio's debug mode
    SQL Server Dead Lock Log
    Debug .NET Framework Source
    SQL Server text field里面有换行符的时候copy到excel数据会散乱
    诊断和修复Web测试记录器(Web Test Recorder)问题
    Can't load Microsoft.ReportViewer.ProcessingObjectModel.dll
    'telnet' is not recognized as an internal or external command
    Linq to XML
  • 原文地址:https://www.cnblogs.com/ribavnu/p/4674095.html
Copyright © 2011-2022 走看看