Форум сайта python.su
Подскажите пожалуйста, как мне отправить собственный сигнал в QLineEdit.
Нужно, чтобы при смене значения QComboBox в QLineEdit вставлялись соответствующие значения.
Закомментированные варианты в changeUserCombo не подходят, так как посылаются сигналы от self.user_edit и self.password_edit, чего мне нужно избежать(сигнал должен отсылаться, когда пользователь вводит данные).
# coding=utf-8 import sys from PyQt4 import QtCore, QtGui class Tuner(QtGui.QWidget): def __init__(self,*args): QtGui.QWidget.__init__(self,*args) self.setWindowTitle(u'Настройка') boxlay = QtGui.QHBoxLayout(self) frame = QtGui.QFrame(self) frame.setFrameShape(QtGui.QFrame.StyledPanel) frame.setFrameShadow(QtGui.QFrame.Raised) gridlay = QtGui.QGridLayout(frame) self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.MSWindowsFixedSizeDialogHint) user_group = QtGui.QGroupBox(u"Пользователь", frame) user_lay = QtGui.QHBoxLayout(user_group) self.user_combo = QtGui.QComboBox(frame) self.params = {'user1':{'login':'111','password':'1111'},'user2':{'login':'222','password':'2222'}} allUser = [] for user in self.params: self.user_combo.addItem(user) allUser.append(user) user_lay.addWidget(self.user_combo) login = QtGui.QLabel(u"Логин",frame) user_lay.addWidget(login) self.user_edit = QtGui.QLineEdit((self.params[allUser[0]]['login']), frame) user_lay.addWidget(self.user_edit) password = QtGui.QLabel(u"Пароль",frame) user_lay.addWidget(password) self.password_edit = QtGui.QLineEdit((self.params[allUser[0]]['password']), frame) user_lay.addWidget(self.password_edit) self.connect(self.user_combo, QtCore.SIGNAL("currentIndexChanged(QString)"),self.changeUserCombo) self.connect(self.user_edit, QtCore.SIGNAL("textChanged(QString)"), self.changeUserEdit) self.connect(self.password_edit, QtCore.SIGNAL("textChanged(QString)"), self.changePasswordEdit) gridlay.addWidget(user_group,1,0,1,5) boxlay.addWidget(frame) def changeUserCombo(self,value): print value user_email = self.params[str(value)]['login'] user_password = self.params[str(value)]['password'] #self.user_edit.setText(user_email) #self.password_edit.setText(user_password) def changePasswordEdit(self,value): print value def changeUserEdit(self,value): print value app = QtGui.QApplication(sys.argv) window = Tuner() window.show() sys.exit(app.exec_())
Офлайн
> Подскажите пожалуйста, как мне отправить собственный сигнал в QLineEdit.
Зачем тебе туда сигнал отправлять? Просто меняй текст у QLineEdit (метод setText) и всё.
Офлайн
KrisTinka
Немного оффтопа: как Вы ставите пустые строки в коде?
Офлайн
Paranoia_AgentПробел в начале.
как Вы ставите пустые строки в коде?
Офлайн
RodegastТак в вопросе же написано, что такой вариант не подходит. Нужен именно сигнал. Это не весь код. Когда в программе пользователь что-то меняет, при закрытии приложения появляется вопрос “Сохранить документ?” Если использовать метод setText, то отправляются сигналы:
> Зачем тебе туда сигнал отправлять? Просто меняй текст у QLineEdit (метод setText) и всё.
self.connect(self.user_edit, QtCore.SIGNAL("textChanged(QString)"), self.changeUserEdit) self.connect(self.password_edit, QtCore.SIGNAL("textChanged(QString)"), self.changePasswordEdit)
Paranoia_AgentНе знаю, само так получилось)))
> как Вы ставите пустые строки в коде?
def changeUserEdit(self,value): if value != self.user_email: parser.set(self.user,'user_email',value) self.changes = True print value def changePasswordEdit(self,value): if value != self.user_password: parser.set(self.user,'user_password',value) self.changes = True print value
Отредактировано KrisTinka (Янв. 10, 2015 10:40:58)
Офлайн
KrisTinka
Я у себя во в много поточной программе вот так создавал сигнал.
import sys import time import threading from PyQt4 import QtGui, QtCore def thread(my_func): """ Запускает функцию в отдельном потоке """ def wrapper(*args, **kwargs): my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs) my_thread.start() return wrapper @thread def processing(signal): """ Эмулирует обработку (скачивание) каких-то данных """ res = [i for i in 'hello'] time.sleep(5) signal.emit(res) # Посылаем сигнал в котором передаём полученные данные class MyWidget(QtGui.QWidget): my_signal = QtCore.pyqtSignal(list, name='my_signal') def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.mainLayout = QtGui.QHBoxLayout() self.setLayout(self.mainLayout) self.b = QtGui.QPushButton("Emit your signal!", self) self.mainLayout.addWidget(self.b) self.b.clicked.connect(lambda: processing(self.my_signal)) # При нажатии на кнопку запускаем обработку данных self.my_signal.connect(self.mySignalHandler, QtCore.Qt.QueuedConnection) # Обработчик сигнала def mySignalHandler(self, data): # Вызывается для обработки сигнала print(data) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) window = MyWidget() window.show() app.exec_()
Офлайн
> Так в вопросе же написано, что такой вариант не подходит….Если использовать метод setText, то отправляются сигналы:
Подключаться научился, а отключатся ещё не умеешь?
def changeUserCombo(self,value): print value user_email = self.params[str(value)]['login'] user_password = self.params[str(value)]['password'] self.disconnect(self.user_edit, QtCore.SIGNAL("textChanged(QString)"), self.changeUserEdit) self.disconnect(self.password_edit, QtCore.SIGNAL("textChanged(QString)"), self.changePasswordEdit) self.user_edit.setText(user_email) self.password_edit.setText(user_password) self.connect(self.user_edit, QtCore.SIGNAL("textChanged(QString)"), self.changeUserEdit) self.connect(self.password_edit, QtCore.SIGNAL("textChanged(QString)"), self.changePasswordEdit)
Офлайн
alex925Сложно для меня)) Не представляю даже, как это в мою программу встроить.
во в много поточной программе
Отредактировано KrisTinka (Янв. 10, 2015 14:49:08)
Офлайн
RodegastТеперь умею)) Спасибо.
> Подключаться научиЛАСЬ, а отключатся ещё не умеешь?
Офлайн
KrisTinkaДа не, там все тупо и просто.
Сложно для меня)) Не представляю даже, как это в мою программу встроить.
Офлайн