Hi all
Some days ago, I send a question to this community about a clickable QLineEdit.
After getting the Hint to use QMouseEvent, I've written the program which is 
working almost good but with a small or perhaps big ugliness and that is:
Below is the imgur link to the screenshots of my program after clicking the 
buttons in sequence:
https://imgur.com/a/rfcP3qB
As you will see in the code blow, I override the QlineEdit widget and define a 
new class " CustomLineEdit " to generate a "clicked" signal, when the user 
pressed with mouse on this field.
I use this "CustomLineEdit" class and place it on the MainWindow with the 
desired "layout".
I couldn't figure out, why this widget is placed not in the MainWindow, but 
outside this window, as you can see in the top picture of the attached 
screenshots.
When I take the line 12 (self.show()) from the code, the generated class will 
not appear.
The problem here is that at the beginning, the MainWindow with a LineEdit field 
should appear at the program start.
Then, after clicking on this field, the keypad should come up outside the 
MainWindow.
Could anyone see, where my mistake is?
Thanks for any help.
Mohsen
Here is the code:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
import sys
from PyQt5.QtWidgets import (QApplication, QLineEdit, QPushButton, QMainWindow,
                             QVBoxLayout, QHBoxLayout, QGridLayout, QWidget)
from PyQt5.QtCore import pyqtSignal, pyqtSlot

class CustomLineEdit(QLineEdit):
    clicked = pyqtSignal()

    def __init__(self):
        super().__init__()

        self.show()

    def mousePressEvent(self, QMouseEvent):
        self.clicked.emit()


class MainWindow(QMainWindow):
    def __init__( self, parent=None ):
        super().__init__(parent)

        self.title = 'Window 1'
        self.left = 700
        self.top = 300
        self.width = 200
        self.height = 200
        self.initUI()

    def initUI(self):

        self.keypad_window = Keypad_Window(self)

        hbox = QHBoxLayout()

        self.cle = CustomLineEdit()
        self.cle.clicked.connect(self.show_keypad_window)
        self.cle.setFixedSize(220, 60)
        self.cle.setStyleSheet("color: red;"
                               "background-color: yellow;"
                               "font-family: Arial;"
                               "font-weight: Bold;"
                               "font-size: 30pt")

        hbox.addWidget(self.cle)
        self.setLayout(hbox)

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.show()

    def show_keypad_window(self):
        self.keypad_window.show()
        self.hide()

    def close(self):
        self.keypad_window.close()
        super(MainWindow, self).close()

    @pyqtSlot(str)
    def update_label(self, txt):
        self.cle.setText(txt)

class Keypad_Window(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent

        self.setGeometry(1200, 500, 230, 400)

        vbox = QVBoxLayout()
        self.display = QLineEdit()
        self.display.setFixedSize(220, 60)
        self.display.setReadOnly(True)
        self.display.setStyleSheet("color: Blue; "
                                   "background-color: lightgreen;"
                                   "font-family: Arial;"
                                   "font-weight: Bold;"
                                   "font-size: 18pt")
        vbox.addWidget(self.display)

        """Create the buttons."""
        self.buttons = {}
        self.gridlay = QGridLayout()

        self.button_name = [['7', '8', '9'],
                            ['4', '5', '6'],
                            ['1', '2', '3'],
                            ['C', '0', '>']]

        self.command_name = [['7', '8', '9'],
                             ['4', '5', '6'],
                             ['1', '2', '3'],
                             ['delete', '0', 'accept']]

        for i in range(4):
            for j in range(3):
                text = self.button_name[i][j]

                # keep a reference to the buttons
                self.buttons[i, j] = QPushButton()
                self.buttons[i, j].setText(text)
                self.buttons[i, j].setObjectName(text)
                self.buttons[i, j].setFixedSize(70, 70)
                if i == 3:
                    if j == 0:
                        self.buttons[i, j].setToolTip('Each click deletes\na 
digit to the left')

                    if j == 2:
                        self.buttons[i, j].setToolTip('The whole 
displayed\nvalue will be taken!')

                self.buttons[i, j].clicked.connect(self.call_button_fun(i, j, 
self.command_name))

                # add to the GridLayout
                self.gridlay.addWidget(self.buttons[i, j], i, j)
                self.buttons[i, j].setStyleSheet("color: blue; "
                                                 "background-color: cyan;"
                                                 "font-family: Arial;"
                                                 "font-weight: Bold;"
                                                 "font-size: 20pt")
        vbox.addLayout(self.gridlay)
        self.setLayout(vbox)

    def call_button_fun(self, i, j, command_name):
        def button_fun():
            if command_name[i][j] == self.button_name[i][j]:
                displayed_text = self.display.text()
                self.new_text = displayed_text + self.button_name[i][j]
                self.display.setText(self.new_text)

            if command_name[i][j] == 'accept':
                print('>-key pressed!')
                self.parent.cle.setText(self.new_text)
                self.close()

            if command_name[i][j] == 'delete':
                print('C-key pressed!')
                self.display.setText('')

        return button_fun

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainwindow = MainWindow()

    # Exception abfangen, wenn sie nicht behandelt wurde
    sys._excepthook = sys.excepthook

    def exception_hook(exctype, value, traceback):
        print(exctype, value, traceback)
        sys._excepthook(exctype, value, traceback)
        sys.exit(1)

    sys.excepthook = exception_hook

    sys.exit(app.exec_())

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to