Search code examples
pythonpython-3.xpyside2

Change QLabelText as QLineEdit text changes


There is this QLineEdit with setText is set to a predefined value and there is a QDialog with QLabel in it which is supposed to show whatever is in the QLineEdit. The code below shows the situation.

import sys
import os
import datetime
from PySide2.QtWidgets import *
from PySide2 import *

now = datetime.datetime.now()
now_str = now.strftime("%H.%M.%S,%d/%m/%y")
default_text = (str("Sugar_" + now_str))


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(600, 500)

        btn = QPushButton("show dialog")

        mw_layout = QVBoxLayout()
        mw_layout.addWidget(btn)
        self.setLayout(mw_layout)

        btn.clicked.connect(show_d)


class dialog(QDialog):
    def __init__(self):
        super(dialog, self).__init__()

        self.resize(400, 350)

        title = QLineEdit()
        title.setText(default_text)

        show_title = QPushButton("Show title")
        cancel = QPushButton("Cancel")

        d_layout = QVBoxLayout()
        d_layout.addWidget(title)
        d_layout.addWidget(show_title)
        d_layout.addWidget(cancel)
        self.setLayout(d_layout)

        t = title.text()

        title_dialog = QDialog()
        label = QLabel()
        label.setText("The title is " + title.text())
        ok = QPushButton("OK!")
        t_layout = QVBoxLayout()
        t_layout.addWidget(label)
        t_layout.addWidget(ok)
        title_dialog.setLayout(t_layout)

        def show_t():
            title_dialog.exec_()
            title_dialog.setModal(True)

        def close_t():
            title_dialog.accept()

        show_title.clicked.connect(show_t)
        ok.clicked.connect(close_t)

        cancel.clicked.connect(self.close_d)

    def close_d(self):
        self.reject()


def show_d():
    d = dialog()
    d.exec_()
    d.setModal(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())

But this doesn't work like I expected it to. The QLabel text just show the default text even when the text in QLineEdit is changed.

The console also shows the following error;

qt.xkb.compose: failed to create compose table.

I think there is something's obviously wrong but I can't seem to find what. Any help appreciated.


Solution

  • You must update the text before a certain event, for example an instant before displaying the dialog:

    class dialog(QDialog):
        def __init__(self):
            super(dialog, self).__init__()
    
            self.resize(400, 350)
    
            self.title_lineedit = QLineEdit(default_text)
    
            show_title = QPushButton("Show title")
            cancel = QPushButton("Cancel")
    
            d_layout = QVBoxLayout(self)
            d_layout.addWidget(self.title_lineedit)
            d_layout.addWidget(show_title)
            d_layout.addWidget(cancel)
    
            self.title_dialog = QDialog()
            self._title_label = QLabel()
    
            ok = QPushButton("OK!")
            t_layout = QVBoxLayout(self.title_dialog)
            t_layout.addWidget(self._title_label)
            t_layout.addWidget(ok)
    
            show_title.clicked.connect(self.on_clicked)
            ok.clicked.connect(self.title_dialog.reject)
            cancel.clicked.connect(self.reject)
    
            self.update_label()
    
        def update_label(self):
            self._title_label.setText("The title is " + self.title_lineedit.text())
    
        def on_clicked(self):
            self.update_label()
            self.title_dialog.exec_()