Получение QPushButton для выполнения 2 действий? - PullRequest
0 голосов
/ 23 ноября 2018

Предисловие: я работаю над приложением Flashcard в PyQt5 и пытаюсь заставить кнопку «Enter» выполнить действие, которое сравнивает 2 строки, вызывая функцию (одна из которых из поля textEdit, другая из спискастрок, которые я предварительно закодировал.) Во-вторых, я хочу, чтобы сравнение показывалось как «Правильно или неправильно», вызывая функцию checkanswer (), но когда я нажимаю кнопку и пытаюсь заставить ее вызывать другую функцию, онабудет повторять то же поведение из checkanswer () .. даже при том, что я пытаюсь вызвать nextcard () [в случае печати («правильно»)]

, что подводит меня к моему вопросу: может ли каждый QPushButton делать толькоодно действие?Я хочу, чтобы он проинформировал пользователя (или заставил его ввести правильный ответ), прежде чем перейти к следующему слову.По сути, я хочу, чтобы одна кнопка вызывала функцию checkanswer (), а также метод nextword () в разное время.

Вот код моего главного окна. Если вам нужна дополнительная информация, дайте мне знать иЯ добавлю это здесь.

class MainWindow(QtWidgets.QMainWindow):

    textvalue = ""
    cardnum = 0                                                     # intialize card number from 0
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)
        self.show()

    def checkanswer(self):
        textvalue = self.ui.lineEditAnswer.text()
        print("You entered: " + textvalue + " $? " + deck[self.cardnum].deflist[0])
        if textvalue == deck[self.cardnum].deflist[0]:
            print("Correct!")
            self.ui.lineEditAnswer.clear()
            textvalue = ""
            self.ui.labelVocab.setText("Correct!\n " + deck[self.cardnum].deflist[0])
            self.ui.pushButtonEnter.setText("Continue")
            self.ui.pushButtonEnter.clicked.connect(self.nextword)
        else:
            print("Incorrect!")
            print(self.cardnum)
            self.ui.lineEditAnswer.clear()
            self.ui.labelVocab.setText("Oops! Correct answer is: " + deck[self.cardnum].deflist[0])

    def nextword(self):
        self.cardnum += 1
        self.ui.lineEditAnswer.clear()
        self.ui.pushButtonEnter.setText("Enter")
        self.ui.labelVocab.setText(deck[self.cardnum].vocab)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)

    if __name__ == "__main__":
        deck = parser.parser()
        app = QApplication(sys.argv)
        win = MainWindow()
        win.show()
        win.ui.labelVocab.setText(deck[MainWindow.cardnum].vocab)

        sys.exit(app.exec_())

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Прежде всего, в Qt doc. Есть хорошее введение:

Сигналы и слоты

, которые я настоятельно рекомендую прочитать.

Где-то посередине вы найдете следующий абзац:

По умолчанию для каждого соединения выдается сигнал;два сигнала испускаются для дублированных соединений.Вы можете разорвать все эти соединения с помощью одного disconnect () вызова.Если вы передадите тип Qt :: UniqueConnection , соединение будет установлено, только если оно не является дубликатом.Если уже есть дубликат (точно такой же сигнал в тот же слот на тех же объектах), соединение не будет установлено, и соединение вернет false.

Я должен признать, я не знало сингле disconnect().Обычно я сохраняю соединение для обработчика сигнала, которое возвращается connect(), когда я собираюсь отключить его позже.Кроме того, Qt позволяет также отключать обработчик теми же аргументами, которые были приведены в connect(), но я никогда не использовал это.

Вот мой маленький пример Python для возни:

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

app = QApplication(sys.argv)
qBtn1 = QPushButton("Click me")
qBtn1.show()

def onBtn1Clicked():
  print("onBtn1Clicked")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me again")
  qBtn1.clicked.connect(onBtn1ClickedAgain)

def onBtn1ClickedAgain():
  print("onBtn1ClickedAgain")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me")
  qBtn1.clicked.connect(onBtn1Clicked)

qBtn1.clicked.connect(onBtn1Clicked)
sys.exit(app.exec_())

Обработчики сигналов onBtn1Clicked() и onBtn1ClickedAgain() соединяют друг друга взаимоисключающими.

Протестировано в cygwin64 в Windows 10:

$ /usr/bin/python3 --version
Python 3.6.4

$ ./testQPushButton.py
onBtn1Clicked
onBtn1ClickedAgain
onBtn1Clicked
onBtn1ClickedAgain

Snapshot of testQPushButton.py Snapshot of testQPushButton.py after clicking button

Что касается множественных вызовов обработчика сигналов, я рекомендую следующее: закомментируйте строку qBtn1.clicked.disconnect() в обоих обработчиках и посмотрите, что происходит (на консоли).

0 голосов
/ 23 ноября 2018

Как Scheff , как указано в комментариях, вы можете вызвать метод pushButton.disconnect() и затем подключить clicked к другому действию.Вот как я исправил свой код:

self.ui.pushButtonEnter.disconnect() self.ui.pushButtonEnter.clicked.connect(self.checkanswer)

...