Форум сайта python.su
Начал изучать PyQt4, и никак не могу найти информацию, как сделать элемент QLineEdit не активным, чтобы в нем нельзя было писать.
Есть кнопка
ok = QtGui.QPushButton(“ok”)
Есть строка для редактирования
ipEdit = QtGui.QLineEdit()
При нажатии на кнопку, QLineEdit() должна становиться не активной.
У родителя - QWidget, нашел метод setDisabled, но если его просто прописать в QtCore.SLOT(), то не работает.
Думаю нужно свой слот создать, как это сделать ?
#!/usr/bin/python
import sys
from PyQt4 import QtGui, QtCore
class GridNetCgf(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle("Окно")
"""Поля для правки адресов"""
ipEdit = QtGui.QLineEdit()
"""Кнопки"""
ok = QtGui.QPushButton("ok")
"""Расстановка элементов"""
hbox = QtGui.QHBoxLayout()
hbox.addWidget(ok)
hbox.addWidget(ipEdit)
self.setLayout(hbox)
self.resize(300,200)
"""Сигналы и слоты"""
self.connect(ok, QtCore.SIGNAL('clicked()'), ipEdit, QtCore.SLOT(метод который делает QLineEdit не активным))
app = QtGui.QApplication(sys.argv)
qb = GridNetCgf()
qb.show()
sys.exit(app.exec_())
Офлайн
как сделать элемент QLineEdit не активным, чтобы в нем нельзя было писать
lineEdit.setDisabled(True)
lineEdit.setReadOnly(True)
Отредактировано (Окт. 9, 2011 17:35:44)
Офлайн
Так я конечно пробовал, вылетает ошибка.
ipEdit = QtGui.QLineEdit()
...
self.connect(save, QtCore.SIGNAL('clicked()'), ipEdit.setDisabled(True))
[aivs@myhost pyqt]$ ./pyarchnetcfg.py
Traceback (most recent call last):
File "./pyarchnetcfg.py", line 99, in <module>
qb = GridNetCgf()
File "./pyarchnetcfg.py", line 94, in __init__
self.connect(save, QtCore.SIGNAL('clicked()'), ipEdit.setDisabled(True))
TypeError: arguments did not match any overloaded call:
QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
Отредактировано (Окт. 10, 2011 16:55:02)
Офлайн
На данный момент я нашел один вариант сделать QLineEdit не активной:
#!/usr/bin/python
# pyarchnetcgf.py
import sys
from PyQt4 import QtGui, QtCore
class GridNetCgf(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
global ipEdit
ipEdit = QtGui.QLineEdit()
save = QtGui.QPushButton("Сохранить")
self.connect(save, QtCore.SIGNAL('clicked()'), self.DisableLine)
def DisableLine(self):
ipEdit.setDisabled(True)
app = QtGui.QApplication(sys.argv)
qb = GridNetCgf()
qb.show()
sys.exit(app.exec_())
Офлайн
Уж layout сами изобразите
#!/usr/bin/python
#-*- coding: UTF-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class GridNetCgf(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ipEdit = QtGui.QLineEdit(self)
self.save = QtGui.QPushButton(u"Сохранить", self)
self.save.clicked.connect(lambda: self.ipEdit.setDisabled(True))
app = QtGui.QApplication(sys.argv)
qb = GridNetCgf()
qb.show()
sys.exit(app.exec_())
Офлайн
Спасибо, Ваш вариант работает, такого синтаксиса я еще не видел, изучаю дальше!
Офлайн
Я принял к сведению вариант truporez.
Скажите чем плох мой вариант! укажите правильный стиль.
Интересует именно использование глобальных переменных, есть ли минусы
#!/usr/bin/python
# pyarchnetcgf.py
import sys
from PyQt4 import QtGui, QtCore
class GridNetCgf(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle("Сетевые настройки")
"""global переменные"""
global radioStatic
global radioAuto
global ipEdit
global maskEdit
global gatewayEdit
global dns1Edit
global dns2Edit
global dns3Edit
global save
global cancel
"""Радио кнопки Статически и Автоматически"""
radioStatic = QtGui.QRadioButton("Статически")
radioAuto = QtGui.QRadioButton("Автоматически")
"""Метки"""
ip = QtGui.QLabel("IP-адрес")
mask = QtGui.QLabel("Маска")
gateway = QtGui.QLabel("Шлюз")
dns1 = QtGui.QLabel("DNS1")
dns2 = QtGui.QLabel("DNS2")
dns3 = QtGui.QLabel("DNS3")
mac = QtGui.QLabel("MAC-адрес")
"""Подсказки для меток"""
ip.setToolTip("IP-адрес - уникальный сетевой адрес узла (компьютера) в компьютернойсети.\nЕго можно узнать у вашего провайдера или системного администратора.")
mask.setToolTip("Маска подсети - битовая маска, определяющая, какая часть IP-адреса \nузла сети относится к сети, а какая - к адресу узла в этой сети.")
gateway.setToolTip("Сетевой шлюз - предоставляет доступ в локальную сеть или интернет")
dns1.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
dns2.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
dns3.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
"""Поля для правки адресов"""
ipEdit = QtGui.QLineEdit()
maskEdit = QtGui.QLineEdit()
gatewayEdit = QtGui.QLineEdit()
dns1Edit = QtGui.QLineEdit()
dns2Edit = QtGui.QLineEdit()
dns3Edit = QtGui.QLineEdit()
macAddress = QtGui.QLineEdit("123.123.123.123")
macAddress.setDisabled(True)
"""Кнопки сохранить и отмена"""
save = QtGui.QPushButton("Сохранить")
cancel = QtGui.QPushButton("Отмена")
"""Расстановка элементов по сетки"""
hboxRadio = QtGui.QHBoxLayout()
hboxRadio.addWidget(radioStatic)
hboxRadio.addWidget(radioAuto)
grid = QtGui.QGridLayout()
grid.setSpacing(5)
grid.addWidget(ip, 1, 0)
grid.addWidget(ipEdit, 1, 1)
grid.addWidget(mask, 2, 0)
grid.addWidget(maskEdit, 2, 1)
grid.addWidget(gateway, 3, 0)
grid.addWidget(gatewayEdit, 3, 1)
grid.addWidget(dns1, 4, 0)
grid.addWidget(dns1Edit, 4, 1)
grid.addWidget(dns2, 5, 0)
grid.addWidget(dns2Edit, 5, 1)
grid.addWidget(dns3, 6, 0)
grid.addWidget(dns3Edit, 6, 1)
grid.addWidget(mac, 7, 0)
grid.addWidget(macAddress, 7, 1)
hboxButton = QtGui.QHBoxLayout()
hboxButton.addStretch(1)
hboxButton.addWidget(save)
hboxButton.addWidget(cancel)
vbox = QtGui.QVBoxLayout()
vbox.addLayout(hboxRadio)
vbox.addLayout(grid)
vbox.addLayout(hboxButton)
"""Геометрия окна"""
self.setLayout(vbox)
self.setGeometry(300,300,0, 0)
"""Сигналы и слоты"""
self.connect(cancel, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
self.connect(radioAuto, QtCore.SIGNAL('toggled(bool)'), self.disableAll)
self.connect(radioStatic, QtCore.SIGNAL('toggled(bool)'), self.enableAll)
"""Сделать элементы не активными"""
def disableAll(self):
ipEdit.setDisabled(True)
maskEdit.setDisabled(True)
gatewayEdit.setDisabled(True)
dns1Edit.setDisabled(True)
dns2Edit.setDisabled(True)
dns3Edit.setDisabled(True)
"""Сделать элементы активными"""
def enableAll(self):
ipEdit.setDisabled(False)
maskEdit.setDisabled(False)
gatewayEdit.setDisabled(False)
dns1Edit.setDisabled(False)
dns2Edit.setDisabled(False)
dns3Edit.setDisabled(False)
app = QtGui.QApplication(sys.argv)
qb = GridNetCgf()
qb.show()
sys.exit(app.exec_())
Отредактировано (Окт. 11, 2011 11:31:02)
Офлайн
Ой-ёй. Уберите global напрочь. Сохраняйте ссылки на объекты в самом экземпляре через self, процедурный, Вы, наш.
Офлайн
Переписал, так в чем минусы global, перед self ?
#!/usr/bin/python
# pyarchnetcgf.py
import sys
from PyQt4 import QtGui, QtCore
class GridNetCgf(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle("Сетевые настройки")
"""Радио кнопки Статически и Автоматически"""
self.radioStatic = QtGui.QRadioButton("Статически", self)
self.radioAuto = QtGui.QRadioButton("Автоматически", self)
self.radioStatic.setChecked(True)
"""Метки"""
ip = QtGui.QLabel("IP-адрес")
mask = QtGui.QLabel("Маска")
gateway = QtGui.QLabel("Шлюз")
dns1 = QtGui.QLabel("DNS1")
dns2 = QtGui.QLabel("DNS2")
dns3 = QtGui.QLabel("DNS3")
mac = QtGui.QLabel("MAC-адрес")
"""Подсказки для меток"""
ip.setToolTip("IP-адрес - уникальный сетевой адрес узла (компьютера) в компьютернойсети.\nЕго можно узнать у вашего провайдера или системного администратора.")
mask.setToolTip("Маска подсети - битовая маска, определяющая, какая часть IP-адреса \nузла сети относится к сети, а какая - к адресу узла в этой сети.")
gateway.setToolTip("Сетевой шлюз - предоставляет доступ в локальную сеть или интернет")
dns1.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
dns2.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
dns3.setToolTip("Сервер предоставляющий IP-адрес хоста по его имени")
"""Поля для правки адресов"""
self.ipEdit = QtGui.QLineEdit(self)
self.maskEdit = QtGui.QLineEdit(self)
self.gatewayEdit = QtGui.QLineEdit(self)
self.dns1Edit = QtGui.QLineEdit(self)
self.dns2Edit = QtGui.QLineEdit(self)
self.dns3Edit = QtGui.QLineEdit(self)
self.macAddress = QtGui.QLineEdit("123.123.123.123", self)
self.macAddress.setDisabled(True)
"""Кнопки сохранить и отмена"""
self.save = QtGui.QPushButton("Сохранить", self)
self.cancel = QtGui.QPushButton("Отмена", self)
"""Расстановка элементов по сетки"""
hboxRadio = QtGui.QHBoxLayout()
hboxRadio.addWidget(self.radioStatic)
hboxRadio.addWidget(self.radioAuto)
grid = QtGui.QGridLayout()
grid.setSpacing(5)
grid.addWidget(ip, 1, 0)
grid.addWidget(self.ipEdit, 1, 1)
grid.addWidget(mask, 2, 0)
grid.addWidget(self.maskEdit, 2, 1)
grid.addWidget(gateway, 3, 0)
grid.addWidget(self.gatewayEdit, 3, 1)
grid.addWidget(dns1, 4, 0)
grid.addWidget(self.dns1Edit, 4, 1)
grid.addWidget(dns2, 5, 0)
grid.addWidget(self.dns2Edit, 5, 1)
grid.addWidget(dns3, 6, 0)
grid.addWidget(self.dns3Edit, 6, 1)
grid.addWidget(mac, 7, 0)
grid.addWidget(self.macAddress, 7, 1)
hboxButton = QtGui.QHBoxLayout()
hboxButton.addStretch(1)
hboxButton.addWidget(self.save)
hboxButton.addWidget(self.cancel)
vbox = QtGui.QVBoxLayout()
vbox.addLayout(hboxRadio)
vbox.addLayout(grid)
vbox.addLayout(hboxButton)
"""Геометрия окна"""
self.setLayout(vbox)
self.setGeometry(300,300,0, 0)
"""Сигналы и слоты"""
self.connect(self.cancel, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
self.connect(self.radioAuto, QtCore.SIGNAL('toggled(bool)'), self.disableAll)
self.connect(self.radioStatic, QtCore.SIGNAL('toggled(bool)'), self.enableAll)
"""Сделать элементы не активными"""
def disableAll(self):
self.ipEdit.setDisabled(True)
self.maskEdit.setDisabled(True)
self.gatewayEdit.setDisabled(True)
self.dns1Edit.setDisabled(True)
self.dns2Edit.setDisabled(True)
self.dns3Edit.setDisabled(True)
"""Сделать элементы активными"""
def enableAll(self):
self.ipEdit.setDisabled(False)
self.maskEdit.setDisabled(False)
self.gatewayEdit.setDisabled(False)
self.dns1Edit.setDisabled(False)
self.dns2Edit.setDisabled(False)
self.dns3Edit.setDisabled(False)
app = QtGui.QApplication(sys.argv)
qb = GridNetCgf()
qb.show()
sys.exit(app.exec_())
Офлайн
Очевидно главная проблема в том, что это глобальные переменные, не принадлежащие объекту. Если вы создадите еще один объект таким способом, получите разнообразные глюки.
Вам бы книжки по ООП почитать, ну и по самому python.
Офлайн