簡體   English   中英

如何從Pyqt5中的QComboBox中選擇選項后動態添加小部件

[英]How to add widgets dynamically upon selecting an option from QComboBox in Pyqt5

當用戶從QComboBox選擇特定項目時,我想在GUI中添加小部件。

通過組合框Pip config中的不同選項,我希望GUI如下圖所示。 在右邊的圖像中,有一個用於Multi pip的額外小部件。 我也想要額外的小部件的位置,如右圖所示。

GUI_1 GUI_2

如何動態添加這些小部件? 請在下面找到代碼。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QRect

class Example(QWidget): 

def __init__(self):
    super(Example, self).__init__()        
    self.initUI()        

def initUI(self):

    vbox = QVBoxLayout()

    CpsLabel = QLabel()
    CpsLabel.setText("<font size = 12>Cps</font>")
    CpsLabel.setAlignment(Qt.AlignCenter)
    CpsLabel.setTextFormat(Qt.RichText)
    CpsPipConfigLabel = QLabel('Pip config:    ')
    CpsPipConfigComboBox = QComboBox()
    CpsPipConfigComboBox.addItems(['Single pip', 'Dual pip', 'Multi pip'])
    CpsPipConfigComboBox.setCurrentIndex(2)
    CpsChannel = QLabel('Cps channel:    ')
    CpsChannelComboBox = QComboBox()
    CpsChannelComboBox.addItems(['A', 'B', 'C', 'D'])  
    CpsChannelComboBox.setCurrentIndex(0) 
    CpsTotalTeethLabel = QLabel('Total teeth:    ')             
    CpsTotalTeethEdit = QLineEdit()
    CpsTotalTeethEdit.setFixedWidth(50)
    CpsTotalTeethEdit.setPlaceholderText('18')
    CpsTotalTeethEdit.setValidator(QIntValidator())                
    CpsMissingTeethLabel = QLabel('Missing teeth:    ')             
    CpsMissingTeethEdit = QLineEdit()
    CpsMissingTeethEdit.setFixedWidth(50)
    CpsMissingTeethEdit.setPlaceholderText('1')
    CpsMissingTeethEdit.setValidator(QIntValidator())                           

    vbox.addWidget(CpsLabel)
    vbox.addStretch()

    CpsQHBox1 = QHBoxLayout()
    CpsQHBox1.setSpacing(0)
    CpsQHBox1.addStretch()
    CpsQHBox1.addWidget(CpsPipConfigLabel)
    CpsQHBox1.addWidget(CpsPipConfigComboBox)
    CpsQHBox1.addStretch()
    vbox.addLayout(CpsQHBox1)
    vbox.addStretch()

    CpsQHBox2 = QHBoxLayout()
    CpsQHBox2.setSpacing(0)
    CpsQHBox2.addStretch()
    CpsQHBox2.addSpacing(20)
    CpsQHBox2.addWidget(CpsTotalTeethLabel)
    CpsQHBox2.addWidget(CpsTotalTeethEdit)
    CpsQHBox2.addStretch()
    CpsQHBox2.addWidget(CpsMissingTeethLabel)
    CpsQHBox2.addWidget(CpsMissingTeethEdit)        
    CpsQHBox2.addStretch()
    vbox.addLayout(CpsQHBox2)
    vbox.addStretch()       

    CpsQHBox3 = QHBoxLayout()
    CpsQHBox3.setSpacing(0)
    CpsQHBox3.addStretch()
    CpsQHBox3.addWidget(CpsChannel)
    CpsQHBox3.addWidget(CpsChannelComboBox)
    CpsQHBox3.addStretch()
    vbox.addLayout(CpsQHBox3)
    vbox.addStretch()        

    self.setLayout(vbox)
    self.setGeometry(200, 100, 300, 300)
    self.setWindowTitle('Steady state data processing') 
    self.setWindowIcon(QIcon('duty_vs_suction_map_sum.png'))                    

    self.setAutoFillBackground(True)
    p = self.palette()
    p.setColor(self.backgroundRole(), QColor(255,250,100))
    # p.setColor(self.backgroundRole(), Qt.blue)
    self.setPalette(p)
    self.show()

if __name__ == '__main__':

app = QApplication(sys.argv)
ex = Example()    
sys.exit(app.exec_())

我建議您設置小部件,並像放置它們一樣將其放置在開頭,但將它們設置為不可見。 然后使一個方法根據qcombobox的當前文本設置適當的小部件可見,並將其連接到qcombobox的激活信號。

您還需要在幾乎每個對象的前面添加self ,以便可以從其他方法中引用它。

class Example(QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        # setup code here...

        self.CpsTotalTeethEdit.setVisible(False)
        self.CpsTotalTeethLabel.setVisible(False)

        self.CpsPipConfigComboBox.activated.connect(self.setup_total_teeth)

        self.show()

    def setup_widgets(self):
        if self.CpsPipConfigComboBox.currentText() == "Multi pip":
            self.CpsTotalTeethLabel.setVisible(True)
            self.CpsTotalTeethEdit.setVisible(True)

通過將項目設置為不可見而不是使用此方法添加它們,還可以將其設置為在cobobox的位置不適合它們時不可見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM