tad
tad

Reputation: 129

How to use QElapsedTimer without a QTimer?

When I tried to use QElapsedTimer to clear a text in a label I couldn't find a way of using it without a QTimer. Is there a way of connecting a method so that it will do something when the QElapsedTimer reaches a certain value? To be more specific, I want to clear the text I set to lblSendError using the print_username() method after 5 seconds ahve passed. Here I have used the clear_username() method to clear it. Right now I have connected it to a QTimer so that it would run periodically.

This is my current implementation of QElapsedTimer in my code:

class win2(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        uic.loadUi('designs/win2.ui', self)
        
        self.butPrevious.clicked.connect(self.goto_page1)
        self.butSend.clicked.connect(self.print_username)
        self.clearTimerE = QtCore.QElapsedTimer()
        print(dir(self.clearTimerE))
        self.clearTimer = QtCore.QTimer()
        self.clearTimer.setInterval(1000)
        self.clearTimer.timeout.connect(self.clear_username)
    
    def goto_page1(self):
        self.hide()
        w1.show()
    def print_username(self):
        self.lblSendError.setText(w1.textUsername.toPlainText())
        self.clearTimerE.start()
        self.clearTimer.start()
    def clear_username(self):
        print(self.clearTimerE.elapsed())
        if self.clearTimerE.elapsed() >= 4000:
            self.lblSendError.setText('')
            #self.clearTimerE.restart()
            self.clearTimer.stop()

Upvotes: 1

Views: 420

Answers (2)

bfris
bfris

Reputation: 5835

To expand a bit on @ekhumoro's answer. QElapsedTimer is meant to act like a stopwatch. It only tells you how many milliseconds have elapsed since start(). It does not have a timeout signal like QTimer

timer = QElapsedTimer()
timer.start()
print(timer.elapsed())  # should be very close to zero.

time.sleep(5)

print(timer.elapsed()) # should be very close to 5000

Upvotes: 1

ekhumoro
ekhumoro

Reputation: 120768

You only need a single-shot timer for this - an elapsed timer isn't needed. Also, I would advise putting all the code for this in your main-window class, as this will make it much easier to access the instances of the other two classes.

Here is a solution based on the code from your previous question:

class MainApp(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('designs/win_stacked.ui', self)
        self.win_1 = win1()
        self.win_2 = win2()
        self.stackedWidget.addWidget(self.win_1)
        self.stackedWidget.addWidget(self.win_2)
        self.stackedWidget.setCurrentWidget(self.win_2)
        self.win_2.butPrevious.clicked.connect(self.goto_page1)
        self.win_2.butSend.clicked.connect(self.print_username)
        self.clearTimer = QtCore.QTimer()
        self.clearTimer.setSingleShot(True)
        self.clearTimer.setInterval(5000)
        self.clearTimer.timeout.connect(self.clear_username)

    def goto_page1(self):
        self.stackedWidget.setCurrentWidget(self.win_1)

    def print_username(self):
        self.win_2.lblSendError.setText(self.win_1.textUsername.toPlainText())
        self.clearTimer.start()

    def clear_username(self):
        self.win_2.lblSendError.setText('')

Upvotes: 2

Related Questions