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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top