Почему эта программа basi c PyQt5 не работает? - PullRequest
0 голосов
/ 16 апреля 2020

Это программа pyqt5, которая предназначена для установки содержимого одного lineedit на содержимое другого lineedit. Это не работает, потому что вы не можете редактировать строки редактирования. Может кто-нибудь сказать мне, почему и как я могу это исправить?

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        firstenter = QLineEdit(self)
        firstenter.move(140,276)
        firstenter.setFixedWidth(240)

        secondenter = QLineEdit(self)
        secondenter.move(420,276)
        secondenter.setFixedWidth(240)

        equalsighn = QLabel(self)
        equalsighn.setText("=")
        equalsighn.move(395,270)

        def conversion():
            try:
                a = firstenter.displayText()
                b = secondenter.displayText()
                if firstenter.isModified() == True:
                    firstenter.setText(str(b))
                elif secondenter.isModified() == True:
                    secondenter.setText(str(a))

            except:
                if firstenter.isModified() == True:
                    secondenter.setText("")
                if secondenter.isModified() == True:
                    firstenter.setText("")

        firstenter.textEdited.connect(conversion)
        secondenter.textEdited.connect(conversion)

        self.setGeometry(500, 300, 800, 500)
        self.setWindowTitle('Test')    
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    ex = Example()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 16 апреля 2020

Это не работает, потому что logi c в первом операторе if неверен:

if firstenter.isModified() == True:
    firstenter.setText(str(b))

Вы сбрасываете содержимое первой строки, редактируете вторую, но так как * Текст 1005 * пуст для начала, он устанавливает текст firstenter соответствующим образом, таким образом сбрасывая его содержимое независимо от того, что вы печатаете. Из-за этого второй if не будет работать по той же причине.

Решение намного проще и использует [sender()], чтобы узнать, какой объект испустил сигнал:

    def conversion():
        if self.sender() == firstenter:
            secondenter.setText(firstenter.text())
        else:
            firstenter.setText(secondenter.text())

Обратите внимание, что вы должны использовать text(), а не displayText(), поскольку последний может вернуть другой результат, если echoMode() не установлен на Normal ( по умолчанию).

Кроме того, try/exception бесполезен, и вы не должны проверять против isModified, поскольку textEdited всегда и только выдается, когда пользователь изменяет текст, а не когда текст изменяется программно с помощью setText().

Предложение: избегайте фиксированных размеров и позиций, их использование, вероятно, приведет к непригодности интерфейса в системах, отличных от вашей (по разным причинам, включая размер экрана, DPI и шрифты по умолчанию). Вы должны предпочесть менеджеров по расположению вместо.

...