Найти - Пользователи
Полная версия: PyQT. Сделать не активным QLineEdit (новичок)
Начало » GUI » PyQT. Сделать не активным QLineEdit (новичок)
1 2
aivs
Начал изучать 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_())
PAVEL_USER
как сделать элемент QLineEdit не активным, чтобы в нем нельзя было писать
lineEdit.setDisabled(True)
lineEdit.setReadOnly(True)
Что-нибудь из двух.
aivs
Так я конечно пробовал, вылетает ошибка.
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'
aivs
На данный момент я нашел один вариант сделать 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_())
Но это как то через жопу, для каждого элемента теперь функцию писать, которая будет делать его неактивным ??!!
truporez
Уж 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_())
aivs
Спасибо, Ваш вариант работает, такого синтаксиса я еще не видел, изучаю дальше!
aivs
Я принял к сведению вариант 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_())
truporez
Ой-ёй. Уберите global напрочь. Сохраняйте ссылки на объекты в самом экземпляре через self, процедурный, Вы, наш.
aivs
Переписал, так в чем минусы 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_())
truporez
Очевидно главная проблема в том, что это глобальные переменные, не принадлежащие объекту. Если вы создадите еще один объект таким способом, получите разнообразные глюки.
Вам бы книжки по ООП почитать, ну и по самому python.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB