1

我制作了这段代码,但它返回了以前的值。

代码:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 
import sys 
class LoginForm(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Test')
        layout = QGridLayout()
        choices = ['1', '2', '3']

        btHome = QPushButton('Button',self)
        btHome.clicked.connect(self.callback)

        self.CmbBx_Cod = QComboBox()
        self.CmbBx_Cod.addItem('Select a value')

        for choices in choices:
            self.CmbBx_Cod.addItem(choices)
        self.CmbBx_Cod.view().pressed.connect(self.callback)

        layout.addWidget(btHome, 0, 0)
        layout.addWidget(self.CmbBx_Cod, 0, 2)
        self.setLayout(layout)
        
    
    def callback(self):
        code = self.CmbBx_Cod.currentText()
        print(f'code {code} selected!')

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    form = LoginForm() 
    form.show() 
    sys.exit(app.exec()) 

当我单击按钮时,我有我想要的值,但是当我选择代码时我想要它。有没有其他方法可以做到这一点?

4

1 回答 1

1

解释

首先,应该理解的是,一旦将鼠标放在一个项目上按下按钮,就会发出按下信号,但这不是由 QComboBox 用来更新当前文本,而是为了稳定单击释放鼠标时发出的信号,因此在您的逻辑中,您试图在更新之前获取当前文本,以便获得意外行为。

适当的解决方案

如果要按下项目,则不应使用 QComboBox ,而应直接使用信号中发送的 QModelIndex :

def callback(self, index):
    code = index.data()
    print(f'code {code} selected!')

相反,如果您想在释放鼠标后获取显示的文本,则可以使用视图的 clicked 信号,或者更好的 currentTextChanged 或 currentIndexChanged 信号。

class LoginForm(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        layout = QGridLayout()
        choices = ["1", "2", "3"]

        btHome = QPushButton("Button", self)
        btHome.clicked.connect(self.callback)

        self.CmbBx_Cod = QComboBox()
        self.CmbBx_Cod.addItem("Select a value")

        for choices in choices:
            self.CmbBx_Cod.addItem(choices)
        self.CmbBx_Cod.currentTextChanged.connect(self.callback)

        layout.addWidget(btHome, 0, 0)
        layout.addWidget(self.CmbBx_Cod, 0, 2)
        self.setLayout(layout)

    def callback(self, code):
        print(f"code {code} selected!")

如果您想通过按下按钮来获取当前文本,那么您必须创建另一个插槽:

class LoginForm(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        layout = QGridLayout()
        choices = ["1", "2", "3"]

        btHome = QPushButton("Button", self)
        btHome.clicked.connect(self.button_callback)

        self.CmbBx_Cod = QComboBox()
        self.CmbBx_Cod.addItem("Select a value")

        for choices in choices:
            self.CmbBx_Cod.addItem(choices)
        self.CmbBx_Cod.currentTextChanged.connect(self.combo_callback)

        layout.addWidget(btHome, 0, 0)
        layout.addWidget(self.CmbBx_Cod, 0, 2)
        self.setLayout(layout)

    def button_callback(self):
        self.printer(self.CmbBx_Cod.currentText())

    def combo_callback(self, code):
        self.printer(code)

    def printer(self, code):
        print(f"code {code} selected!")
于 2020-12-28T18:06:42.697 回答