PyQt5: Как проверить, пусто ли мое текстовое поле, передав ссылку / значение? - PullRequest
0 голосов
/ 06 мая 2020

Хотите проверить, пусто ли поле textbox1? Как передать справку?

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

class My_Process(QWidget):
    def __init__(self,*args):
        self.textbox = QLineEdit()

    def checkstatus(self):
        if self.textbox.text() =="":
            print("Empty Value Not Allowed")
            self.textbox.setFocus()
        else:
            print(" Your Text : ",textbox.text())
#----------------------------------------------------------------------------------------------
class Mainprg(QMainWindow):
    def __init__(self):

        super().__init__()
        self.tb = My_Process(self)
        self.text1 = QLineEdit(self)
        self.text2 = QLineEdit(self)
        self.text1.setGeometry(100,100,300,30)
        self.text2.setGeometry(100,200,300,30)
        self.text1.editingFinished.connect(self.tb.checkstatus)

        self.showMaximized()

app = QApplication(sys.argv)
window = Mainprg()
sys.exit(app.exec_())

1 Ответ

1 голос
/ 06 мая 2020

Для меня сбивает с толку создание нового класса для проверки. Я бы сделал checkstatus методом Mainprg:

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

class Mainprg(QMainWindow):
    def __init__(self):

        super().__init__()
        self.text1 = QLineEdit(self)
        self.text2 = QLineEdit(self)

        self.setGeometry(300, 200, 600, 450)

        self.text1.setGeometry(100,100,300,30)
        self.text2.setGeometry(100,200,300,30)
        self.text1.editingFinished.connect(self.checkstatus)

        self.show()

    def checkstatus(self):
        if self.text1.text() == "":
            print("Empty Value Not Allowed")
            self.text1.setFocus()
        else:
            print(" Your Text : ", self.text1.text())

app = QApplication(sys.argv)
window = Mainprg()
sys.exit(app.exec_())

Приведенный выше код работает, но, вероятно, вам нужно что-то более общее c для более чем одного QLineEdit. Нет действительно хорошего способа передать аргументы в операторы соединения PyQt, поэтому большинство людей используют лямбды:

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

class Mainprg(QMainWindow):
    def __init__(self):

        super().__init__()
        self.text1 = QLineEdit(self)
        self.text2 = QLineEdit(self)

        self.setGeometry(300, 200, 600, 450)

        self.text1.setGeometry(100,100,300,30)
        self.text2.setGeometry(100,200,300,30)
        self.text1.editingFinished.connect(lambda: self.checkstatus(self.text1))
        self.text2.editingFinished.connect(lambda: self.checkstatus(self.text2))

        self.show()

    def checkstatus(self, widget):
        if widget.text() == "":
            print("Empty Value Not Allowed")
            widget.setFocus()
        else:
            print(" Your Text : ", widget.text())

app = QApplication(sys.argv)
window = Mainprg()
sys.exit(app.exec_())

Этот код работает больше так, как вы хотите, но вы столкнетесь с проблемой, если text1 пуст и вы пытаетесь перейти к text2. Вы получите «превышение максимальной глубины рекурсии», потому что метод checkstatus вызывается неоднократно. Чтобы предотвратить это, вы должны выполнить одно из следующих действий:

  1. создать обработчик для события focusChanged QApplication
  2. создать QValidator и применить его к своим виджетам, используя setValidator()

Если вы настроены создать новый класс, вы можете попробовать следующее:

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

class My_Process():
    def __init__(self, widget):
        self.textbox = widget

    def checkstatus(self):
        if self.textbox.text() == "":
            print("Empty Value Not Allowed")
            self.textbox.setFocus()
        else:
            print(" Your Text : ", self.textbox.text())

class Mainprg(QMainWindow):
    def __init__(self):

        super().__init__()

        self.text1 = QLineEdit(self)
        self.text2 = QLineEdit(self)

        self.process = My_Process(self.text1)

        self.setGeometry(300, 200, 600, 450)

        self.text1.setGeometry(100,100,300,30)
        self.text2.setGeometry(100,200,300,30)
        self.text1.editingFinished.connect(self.process.checkstatus)

        self.show()

app = QApplication(sys.argv)
window = Mainprg()
sys.exit(app.exec_())

Чтобы передать text1 классу, вы добавляете аргумент к init метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...