Найти - Пользователи
Полная версия: Pyqt4 собственный сигнал
Начало » GUI » Pyqt4 собственный сигнал
1
KrisTinka
Подскажите пожалуйста, как мне отправить собственный сигнал в 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_())
Rodegast
> Подскажите пожалуйста, как мне отправить собственный сигнал в QLineEdit.

Зачем тебе туда сигнал отправлять? Просто меняй текст у QLineEdit (метод setText) и всё.
Paranoia_Agent
KrisTinka
Немного оффтопа: как Вы ставите пустые строки в коде?
py.user.next
Paranoia_Agent
как Вы ставите пустые строки в коде?
Пробел в начале.
KrisTinka
Rodegast
> Зачем тебе туда сигнал отправлять? Просто меняй текст у QLineEdit (метод setText) и всё.
Так в вопросе же написано, что такой вариант не подходит. Нужен именно сигнал. Это не весь код. Когда в программе пользователь что-то меняет, при закрытии приложения появляется вопрос “Сохранить документ?” Если использовать метод setText, то отправляются сигналы:
        self.connect(self.user_edit, QtCore.SIGNAL("textChanged(QString)"), self.changeUserEdit)
        self.connect(self.password_edit, QtCore.SIGNAL("textChanged(QString)"), self.changePasswordEdit)
Которые дают программе понять, что документ изменился. Помимо этого при смене ComboBox, нужно отправить около 50 сигналов разным объектам с разными аргументами.
Paranoia_Agent
> как Вы ставите пустые строки в коде?
Не знаю, само так получилось)))
P.S. Пока решила проблему костылём, но вопрос остаётся открыт
    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
alex925
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_()
Rodegast
> Так в вопросе же написано, что такой вариант не подходит….Если использовать метод 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)
KrisTinka
alex925
во в много поточной программе
Сложно для меня)) Не представляю даже, как это в мою программу встроить.
KrisTinka
Rodegast
> Подключаться научиЛАСЬ, а отключатся ещё не умеешь?
Теперь умею)) Спасибо.
alex925
KrisTinka
Сложно для меня)) Не представляю даже, как это в мою программу встроить.
Да не, там все тупо и просто.

Вот так создаю свой синглал
my_signal = QtCore.pyqtSignal(list, name='my_signal')

Передаю этот сигнал в функцию, которая будет запущена в отдельном потоке.
self.b.clicked.connect(lambda: processing(self.my_signal))

Потом ставлю обработчик на этот сигнал
self.my_signal.connect(self.mySignalHandler, QtCore.Qt.QueuedConnection)

Ну и в нужный момент из другого потока посылаю свой сигнал
signal.emit(res)

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