PyQt SpinBox sempre retornando 0, a menos que previamente definido com setValue
Pergunta
Eu tenho uma GUI PyQt usando Python 2.7 e QT 4.7 que abre uma caixa de diálogo chamada por um botão.Posso passar valores entre a caixa de diálogo e a GUI principal na maior parte do tempo, até chegar a um QSpinBox na caixa de diálogo.
A classe que define o diálogo é assim:
class BuyDialog(QDialog):
def __init__(self):
QDialog.__init__(self)
global ci, space, cash, current, price, qtyToBuy
self.ui = Ui_buyDialog() # Set up the user interface from Designer.
self.ui.setupUi(self)
for i in range(0, len(ci)):
item = str(ci[i][0])
price = str(ci[i][1])
self.ui.itemsComboBox.addItem(item)
price = str(self.getPrice())
gPrice = "$" + price
print gPrice
self.ui.priceFieldLabel.setText(gPrice)
self.ui.itemsComboBox.currentIndexChanged['QString'].connect(self.updateItems)
self.ui.availableSpaceFieldLabel.setText(space)
canBuy = str(funcs.youCanAfford(cash, price))
self.ui.canAffordFieldLabel.setText(canBuy)
qtyToBuy = self.ui.buySpinBox.value()
O código que lida com o diálogo em si é
def buyDialog(self):
global current, price, qtyToBuy
dialog = BuyDialog()
result = dialog.exec_()
if result:
dialogResult = (current, price, qtyToBuy)
print dialogResult #debug
return dialogResult
current
vem de uma caixa de combinação na caixa de diálogo e price
vem de uma pesquisa de lista contra current
.Eu sei que a caixa de diálogo é atualizada corretamente, pois os valores retornados para current
e price
estão corretas.No entanto, qtyToBuy
sempre retorna 0.A única maneira de retornar algo diferente é ligando setValue()
nele quando for iniciado.Em todos os lugares que olhei, tenho a impressão de que sou a única pessoa que teve esse problema, pois não consigo encontrar mais nada sobre esse problema.Alguém tem alguma ideia de qual é o problema?
Solução
Como @Frank apontou que desde o value()
do spinBox for recuperado antes da caixa de diálogo ser mostrada, a entrada do usuário no spinBox não afetará o valor de qtyToBuy
, sempre fornecerá o valor padrão de spinBox (que é 0 no seu caso).Para recuperar o valor especificado pelo usuário do spinBox, você deve recuperar o valor depois que a caixa de diálogo for fechada (ou seja,o usuário pressiona OK na caixa de diálogo)
def buyDialog(self):
global current, price, qtyToBuy
dialog = BuyDialog()
result = dialog.exec_()
qtyToBuy = dialog.ui.buySpinBox.value() # add this line here
if result:
dialogResult = (current, price, qtyToBuy)
print dialogResult #debug
return dialogResult
Agora o print
a instrução imprimirá o valor que era o valor em spinBox quando o usuário pressionou OK na caixa de diálogo.