Блокировка LineEdit после нажатия на CheckBox

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
Всем добрый день!
При приложения необходимо, что бы по нажатию на CheckBox некоторые поля для заполнения (LineEdit-ы) должны потерять возможность ввода данных (Disable) Пытался Реализовать это через if и isReadOnly
1648743254413.png после кода со структурой интерфейса, но к сожалению по нажатию на чек бокс поля не блокируются...Подскажите пожалуйста что не так.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
вам нужно сигнал stateChanged получать, когда чекбокс был изменен, и в слоте в зависимости от статуса чекбокса делать свои действия
 

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
вам нужно сигнал stateChanged получать, когда чекбокс был изменен, и в слоте в зависимости от статуса чекбокса делать свои действия
А каким методом это можно реализовать ?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
А каким методом это можно реализовать ?
можно так
Python:
import sys
from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.checkBox = QtWidgets.QCheckBox('чекбокс')
        self.LineEdit = QtWidgets.QLineEdit()

        self.vlayout = QtWidgets.QVBoxLayout()
        self.vlayout.addWidget(self.checkBox)
        self.vlayout.addWidget(self.LineEdit)
        self.setLayout(self.vlayout)

        self.checkBox.stateChanged.connect(lambda: self.selectСheckBox())

    def selectСheckBox(self):
        if self.checkBox.isChecked():
            self.LineEdit.setReadOnly(True)
        else:
            self.LineEdit.setReadOnly(False)


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

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
можно так
Python:
import sys
from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.checkBox = QtWidgets.QCheckBox('чекбокс')
        self.LineEdit = QtWidgets.QLineEdit()

        self.vlayout = QtWidgets.QVBoxLayout()
        self.vlayout.addWidget(self.checkBox)
        self.vlayout.addWidget(self.LineEdit)
        self.setLayout(self.vlayout)

        self.checkBox.stateChanged.connect(lambda: self.selectСheckBox())

    def selectСheckBox(self):
        if self.checkBox.isChecked():
            self.LineEdit.setReadOnly(True)
        else:
            self.LineEdit.setReadOnly(False)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())
Если задавать, как Вы показали check box, то в конце Pychar подчеркивает функцию selectСheckBox(self) и не находит в ней LineEdit
1648747389192.png
Python:
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 1000)
        MainWindow.setMinimumSize(QtCore.QSize(970, 0))
        MainWindow.setMaximumSize(QtCore.QSize(970, 16777215))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 90, 211, 211))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("../../../bak1.png"))
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(10, 0, 131, 71))
        self.label_2.setText("")
        self.label_2.setPixmap(QtGui.QPixmap("../../../ASUTP.png"))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setEnabled(True)
        self.label_3.setGeometry(QtCore.QRect(240, 10, 331, 41))
        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(True)
        font.setItalic(False)
        font.setUnderline(False)
        font.setWeight(75)
        font.setStrikeOut(False)
        font.setKerning(True)
        self.label_3.setFont(font)
        self.label_3.setMouseTracking(False)
        self.label_3.setTabletTracking(False)
        self.label_3.setAcceptDrops(False)
        self.label_3.setAutoFillBackground(False)
        self.label_3.setStyleSheet("border: 2px solid black;\n"
"border-radius: 10;")
        self.label_3.setScaledContents(True)
        self.label_3.setWordWrap(True)
        self.label_3.setOpenExternalLinks(False)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(280, 60, 251, 21))
        font = QtGui.QFont()
        font.setBold(False)
        font.setItalic(False)
        font.setUnderline(True)
        font.setWeight(50)
        self.label_4.setFont(font)
        self.label_4.setScaledContents(True)
        self.label_4.setWordWrap(True)
        self.label_4.setObjectName("label_4")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.vlayout = QtWidgets.QVBoxLayout()
        self.vlayout.addWidget(self.checkBox)
        self.checkBox.stateChanged.connect(lambda: self.selectСheckBox())
        self.checkBox.setGeometry(QtCore.QRect(40, 330, 331, 21))
        self.checkBox.setObjectName("checkBox")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(470, 90, 251, 211))
        self.label_5.setText("")
        self.label_5.setPixmap(QtGui.QPixmap("../../../bak2.png"))
        self.label_5.setScaledContents(True)
        self.label_5.setObjectName("label_5")
        self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_2.setGeometry(QtCore.QRect(470, 330, 311, 21))
        self.checkBox_2.setObjectName("checkBox_2")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(40, 370, 371, 61))
        font = QtGui.QFont()
        font.setUnderline(True)
        self.label_6.setFont(font)
        self.label_6.setScaledContents(True)
        self.label_6.setWordWrap(True)
        self.label_6.setObjectName("label_6")
        self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_3.setGeometry(QtCore.QRect(40, 440, 21, 21))
        self.checkBox_3.setTabletTracking(False)
        self.checkBox_3.setText("")
        self.checkBox_3.setObjectName("checkBox_3")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(70, 430, 311, 41))
        self.label_7.setScaledContents(True)
        self.label_7.setWordWrap(True)
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(40, 480, 281, 21))
        self.label_8.setScaledContents(True)
        self.label_8.setObjectName("label_8")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(300, 480, 81, 21))
        self.lineEdit.setObjectName("lineEdit")

        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(390, 480, 31, 21))
        self.label_9.setScaledContents(True)
        self.label_9.setObjectName("label_9")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(40, 520, 281, 21))
        self.label_10.setScaledContents(True)
        self.label_10.setObjectName("label_10")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(300, 520, 81, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_12 = QtWidgets.QLabel(self.centralwidget)
        self.label_12.setGeometry(QtCore.QRect(390, 520, 51, 21))
        self.label_12.setScaledContents(True)
        self.label_12.setObjectName("label_12")
        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(470, 380, 341, 41))
        font = QtGui.QFont()
        font.setUnderline(True)
        self.label_11.setFont(font)
        self.label_11.setScaledContents(True)
        self.label_11.setWordWrap(True)
        self.label_11.setObjectName("label_11")
        self.label_13 = QtWidgets.QLabel(self.centralwidget)
        self.label_13.setGeometry(QtCore.QRect(500, 430, 371, 31))
        self.label_13.setScaledContents(True)
        self.label_13.setWordWrap(True)
        self.label_13.setObjectName("label_13")
        self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_4.setGeometry(QtCore.QRect(470, 436, 21, 21))
        self.checkBox_4.setTabletTracking(False)
        self.checkBox_4.setText("")
        self.checkBox_4.setObjectName("checkBox_4")
        self.label_14 = QtWidgets.QLabel(self.centralwidget)
        self.label_14.setGeometry(QtCore.QRect(920, 510, 51, 21))
        self.label_14.setScaledContents(True)
        self.label_14.setObjectName("label_14")
        self.label_15 = QtWidgets.QLabel(self.centralwidget)
        self.label_15.setGeometry(QtCore.QRect(470, 470, 261, 21))
        self.label_15.setScaledContents(True)
        self.label_15.setObjectName("label_15")
        self.label_16 = QtWidgets.QLabel(self.centralwidget)
        self.label_16.setGeometry(QtCore.QRect(470, 500, 241, 21))
        self.label_16.setScaledContents(True)
        self.label_16.setObjectName("label_16")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(830, 475, 81, 21))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 944, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def selectСheckBox(self):
            if self.checkBox.isChecked():
                    self.LineEdit.setReadOnly(True)
            else:
                    self.LineEdit.setReadOnly(False)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
ну это же пример, вам нужно свой элемент подставить...
если по первому посту верно, то

Python:
def selectСheckBox(self):
    if self.checkBox.isChecked():
        ui.lineEdit.setReadOnly(True)
    else:
        ui.lineEdit.setReadOnly(False)

и коннект я не вижу у вас, вы знакомы с Qt?

upd
а увидел...
у вас чет все в кучу, не читаемо совершенно
и отступы в selectСheckBox не верны
 
  • Мне нравится
Реакции: Иван Фарадей

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
ну это же пример, вам нужно свой элемент подставить...
если по первому посту верно, то

Python:
def selectСheckBox(self):
    if self.checkBox.isChecked():
        ui.lineEdit.setReadOnly(True)
    else:
        ui.lineEdit.setReadOnly(False)

и коннект я не вижу у вас, вы знакомы с Qt?

upd
а увидел...
у вас чет все в кучу, не читаемо совершенно
и отступы в selectСheckBox не верны
Прошу прощение, просто код достаточно массивный не уместился в ограничение на 10000, поэтому приложил файл (как раз в кучу именно поэтому, удалял лишнее)1648750568586.png
Получается данную функцию нужно задавать в Class Ui_MainWindow(object) ?
Просто LineEdit задан в setupUI, он видимо не видит и поэтому ошибку выдает?
Обычно я checkbox задавай через QT designer и он их выводил 1648750740335.png
 

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
ну это же пример, вам нужно свой элемент подставить...
если по первому посту верно, то

Python:
def selectСheckBox(self):
    if self.checkBox.isChecked():
        ui.lineEdit.setReadOnly(True)
    else:
        ui.lineEdit.setReadOnly(False)

и коннект я не вижу у вас, вы знакомы с Qt?

upd
а увидел...
у вас чет все в кучу, не читаемо совершенно
и отступы в selectСheckBox не верны
А если задавать функцию selectCheckBox внутри функции setupUi(self, MainWindow)
ТО тоже при выборе чек бокса вылетает приложение
1648750943772.pngПодскажите пожалуйста, я уже два дня голову ломаю, как это нормально сделать....
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
вообще класс ui обычно отдельно от класса приложения, в приложение он нужен для доступа к элементам интерфейса, а сигнал и слот должны быть в классе вашего приложения, где описана вся логика, и который унаследован от Ui_MainWindow
но у вас я так понимаю вся логика в классе ui

вот ПРИМЕР (то есть нужно подставить свои элементы) который похож на ваш (я старался приблизить)
Python:
import sys
from PyQt5 import QtWidgets, QtCore


class Ui_MainWindow():
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(200, 200)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.checkBox = QtWidgets.QCheckBox(self.centralWidget)
        self.checkBox.move(30, 40)
        self.checkBox.setObjectName("чекбокс")
        self.lineEdit = QtWidgets.QLineEdit(self.centralWidget)
        self.lineEdit.move(30, 90)
        self.lineEdit.setObjectName("lineEdit")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        self.checkBox.setText(_translate("MainWindow", "чекбокс"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.checkBox.stateChanged.connect(self.selectCheckBox)

    def selectCheckBox(self):
        if self.checkBox.isChecked():
            self.lineEdit.setReadOnly(True)
        else:
            self.lineEdit.setReadOnly(False)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())
 
Последнее редактирование:
  • Мне нравится
Реакции: Иван Фарадей

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
вообще класс ui обычно отдельно от класса приложения, в приложение он нужен для доступа к элементам интерфейса, а сигнал и слот должны быть в классе вашего приложения, где описана вся логика, и который унаследован от Ui_MainWindow
но у вас я так понимаю вся логика в классе ui

вот ПРИМЕР (то есть нужно подставить свои элементы) который похож на ваш (я старался приблизить)
Python:
import sys
from PyQt5 import QtWidgets, QtCore


class Ui_MainWindow():
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(200, 200)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.checkBox = QtWidgets.QCheckBox(self.centralWidget)
        self.checkBox.move(30, 40)
        self.checkBox.setObjectName("чекбокс")
        self.lineEdit = QtWidgets.QLineEdit(self.centralWidget)
        self.lineEdit.move(30, 90)
        self.lineEdit.setObjectName("lineEdit")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        self.checkBox.setText(_translate("MainWindow", "чекбокс"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.checkBox.stateChanged.connect(self.selectCheckBox)

    def selectCheckBox(self):
        if self.checkBox.isChecked():
            self.lineEdit.setReadOnly(True)
        else:
            self.lineEdit.setReadOnly(False)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())
Спасибо Вам огромное за терпение и объяснение
Я вроде сделал все по Вашему примеру, но при нажатии на чек бокс приложение вылетает...
Подскажите пожалуйста еще раз, в чем я опять ошибся...
Я ввел CheckBox
Python:
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(40, 330, 331, 21))
self.checkBox.setObjectName("checkBox")
И далее записал новый класс
1648757192592.png
 

Вложения

  • C_V17t2.zip
    3,6 КБ · Просмотры: 1

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Спасибо Вам огромное за терпение и объяснение
Я вроде сделал все по Вашему примеру, но при нажатии на чек бокс приложение вылетает...
Подскажите пожалуйста еще раз, в чем я опять ошибся...
Я ввел CheckBox
Python:
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(40, 330, 331, 21))
self.checkBox.setObjectName("checkBox")
И далее записал новый класс
Посмотреть вложение 1728
ваша ошибка в том, что вы делаете объект класса ui, этого не нужно делать, и нужно сделать объект класса MainWindow, который мы определили, напишите так
Python:
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainwindow = MainWindow()
    # ui = Ui_MainWindow()
    # ui.setupUi(MainWindow)
    mainwindow.show()
    sys.exit(app.exec_())

P.S.
нейминг ужасный, не понятно какой элемент к кому относиться...
 

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
ваша ошибка в том, что вы делаете объект класса ui, этого не нужно делать, и нужно сделать объект класса MainWindow, который мы определили, напишите так
Python:
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainwindow = MainWindow()
    # ui = Ui_MainWindow()
    # ui.setupUi(MainWindow)
    mainwindow.show()
    sys.exit(app.exec_())

P.S.
нейминг ужасный, не понятно какой элемент к кому относиться...
И даже так при нажатие на чек бокс приложение вылетает....
Изменил 1648794913879.png
За нейминг извиняют, это все qt designer
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
За нейминг извиняют, это все qt designer
элементам можно давать имена в qt designer'е

И даже так при нажатие на чек бокс приложение вылетает....
Изменил Посмотреть вложение 1730
За нейминг извиняют, это все qt designer
вы запускаете именно то что вы мне скинули? или в проекте еще что то есть?
 
  • Мне нравится
Реакции: Иван Фарадей

Иван Фарадей

Новичок
Пользователь
Мар 31, 2022
8
0
1
элементам можно давать имена в qt designer'е


вы запускаете именно то что вы мне скинули? или в проекте еще что то есть?
Спасибо огромное, все заработало!
 

Форум IT Специалистов