Не работает connect pyqt5

Обмен сигналами PyQt5 между рабочим потоком и главным окном работает некорректно

Я создаю приложение с PyQt5, которое имеет очень простой пользовательский интерфейс. Существует раскрывающийся список, из которого можно выбрать значение, а затем есть кнопка, по которой можно щелкнуть, и действие будет выполнено на основе текущего значения в раскрывающемся списке.

В настоящее время, если я запускаю приведенный ниже код, я могу получить значение из раскрывающегося списка, и оно будет отправлено рабочему потоку до запуска myaction.myaction(customer_name) . Код также работает нормально, но графический интерфейс не работает так, как я хочу, пока выполняется функция в рабочем потоке. Когда я нажимаю кнопку Пуск , она должна послать сигнал в графический интерфейс, чтобы отключить кнопку, изменить ее метку и цвет, но этого никогда не происходит. Когда функция завершится, ее следует вернуть в исходную форму.

Проблема в том, как я обрабатываю сигналы, или в моих классах есть избыточные функции? Как правильно отправлять значение раскрывающегося списка в рабочий поток каждый раз, когда нажимается кнопка, чтобы я мог просто использовать его как переменную?

Каждое возможное решение этой проблемы, которое я нахожу в Интернете, вызывает у меня волнение, но ни одно из них еще не работает для меня, или некоторые из них слишком запутаны, чтобы я мог понять.

Вот несколько ответов, которые я уже прошел

2 ответа

Проблема вызвана очень распространенной и неправильной концепцией, они думают, что QThread — это Qt Thread , то есть новый поток, созданный Qt, но нет, QThread — это поток handler , как указано в документации:

Класс QThread обеспечивает независимый от платформы способ управления потоками.

Объект QThread управляет одним потоком управления в программе. QThreads начинают выполняться в run (). По умолчанию run () запускает цикл событий, вызывая exec (), и запускает цикл событий Qt внутри потока.

Единственная часть, которая выполняется в другом потоке, — это метод запуска, и в вашем случае вы не вызываете, потому что ваша логика отличается, вы не хотите непрерывно выполнять тяжелую задачу, а по запросу пользователя, поэтому дизайн должен соответствовать дизайну worker, но вы используете QThread в качестве базового класса, и это неверно, вы должны использовать QObject в качестве базового класса и переместить его в новый поток, чтобы QObject выполнял свои задачи в этом потоке, предотвращая блокировку GUI.

QObject не является потокобезопасным, он живет в потоке, и поток, в котором он определяется следующим:

Читайте также:  Как настроить телевизор artel без пульта

QObject живет в родительском потоке

Если у вас нет родителя, живите в потоке, в котором он был создан, если вы не перешли в другой поток.

И вы можете перейти к другому потоку с помощью функции moveToThread() , но moveToThread() завершится ошибкой, если QObject имеет родителя, поскольку первый критерий является привилегированным.

С другой стороны, если вы хотите вызвать метод из другого потока, необходимо использовать декоратор @QtCore.pyqtSlot()

Учитывая вышеизложенное, получаем следующее решение:

Наблюдение: Кроме того, как вы можете видеть в моем решении, QThread будет дочерним элементом окна, потому что QThread — это QObject , который обрабатывает другой поток.

Вы действительно пишете очень сложные простые вещи. Попытайся:

Источник

Problems with connect in pyqt5

I have a problem. I am writing a simple app in Pyqt5. I am trying to do this block of code in PyQt:

But when I am trying to use «connect» IDE tells me that «MainWindow» don’t have method. How can I do it ?? Please help

This is my code:

1 Answer 1

The connect method belongs to the signal that you wish to connect to a specific slot, not to the MainWindow widget itself. (BTW, you should consider inheriting from QMainWindow instead.)

In your code, the MainWindow widget is not a signal, so does not have a connect method. Also, even if it did, you need to specify the slot to which you’re trying to connect the signal, which is also missing.

In other words, you must declare a pyqtSignal , if you’re not using a pre-existing one, and then connect it to the pyqtSlot of your choice. Whether this slot is pre-defined or a custom one is up to you.

Consider the following code snippet, which I tested in Python3:

Notice that the button’s clicked signal, not the button, is what gets connect ed to the dialog’s close slot, not the dialog itself.

EDIT 1:

Just noticed that the very code you’ve posted has an example of how to properly perform a connection.

If your code has not simply been copy-pasted from some other place, you should’ve noticed that you seem to know how to properly connect signals and slots already. This line plainly gives it away:

If your MainWindow does have a btn_click method, then it should get invoked after the QPushButton named btn gets clicked .

EDIT 2:

Based on your recent comment, you seem to simply be trying to translate a snippet for a larger application, so consider the following code:

The code above was tested to work as expected.

Источник

PyQt5 При запуске окна из другого окна, методы класса не работают

Не знаю, как грамотно объяснить свою проблему, но предполагаю, что она точно в открытии нового окна по нажатию кнопки в другом окне.
Так вот, в классе начального окна у меня есть метод — OpenWindowWork(59-67 строки) В нем я открываю основное рабочее окно, когда оно открывается, то все функции, которыми я оснастил программу не работают.
А если я начну с запуска Основного рабочего окна(502-506 строки), пропустив запуск Старотового окна, то все работает, как я запланировал.

Читайте также:  Часы q15 koro как настроить

В чем моя ошибка?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Открытие окна из другого файла PyQt5
Добрый вечер форумчане. Вопрос про открытие виджета из другого файла. Допустим есть 2 файла.

Из одного класса обратиться к свойству progressBar из другого класса (основного окна)
Привет! 🙂 Помогите пожалуйста нубу (мне). У меня есть два класса. Первый (основной), его код.

Наследование класса из другого окна
Такая проблема, есть окно со Frame и менюшкой с кнопками, при переключение страниц нужно обновлять.

Реопен открытого окна из другого класса
Доброе время суток, столкнулся с проблемой: //по закрытию должен отправить сигнал в слот.

Подстроить размер окна относительно размера другого окна в X11
Есть два риложения, у обоих устанавливается атрибут WA_X11NetWmWindowTypeaDock. Сначала запускается.

Как связать сигнал одного окна и слот другого окна
Здравствуйте! Такой вопрос: Имеется главное окно MainWindow и диалоговое окно Dialog. На диалоговом.

Передача информации из текстбоксов одного окна в таблицу другого окна
Доброго времени суток, пишу программу для mac os x, нужна подсказка, как сделать (не прошу делать.

Перерисовка окна другого процесса через дескриптор этого окна
Приветствую всех. Может кто-то знает, как перерисовать окно другого процесса через дескриптор.

Закрытие одного окна по таймеру с последующем открытием другого окна
Приветствую! Необходимо создать приветственное окно для программы. Сначала должно открываться.

Вызов окна из другого окна. Паттерн MVVM
тут ламмерский вопрос) есть 2 окна со своими вьюмодельс. в первом окне есть кнопка, по которой.

Источник

Не работает PyQt5

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не работает PyQt5
Долго пытался найти решение данной проблемы, ничего не выходило. Когда я из PyQt5.QtWidgets.

PyQT5. Не работает qApp.quit
Изучаю PyQT5 при помощи одного сайта, и столкнулся с тем, что не работает qApp.quit. Может быть там.

(Gnome 3 | Unity) + PyQT5. Не работает русская раскладка в полях ввода
Столкнулся с проблемой! Написал небольшое приложение на PyQt, типо мессенджера для вк. Но вот.

PyQt5
В чем проблема? Обычный код с сайта https://pythonworld.ru/gui/pyqt5-firstprograms.html вроде бы.

Pyqt5
Напишите программу с хорошо разработанным, разработанным и протестированным графическим.

PyQt5 и OpenGL
Добрый день, уважаемые программисты! Я делаю интерфейс в pyqt5, мне необходимо сделать отрисовку.

Установка PyQt5
Не могу установить PyQt5. Скачал с официального сайта и запустил файл «configure.py». Появилось и.

Читайте также:  Что делать если у айфона не работает автоповорот

PyQt5 python 3.4.1
Приветствую всех и прошу помощи! нужна программа в которой 4 строчки куда заносятся переменные.

Источник

События и сигналы в PyQt5

В этой части учебника PyQt5, мы изучим события и сигналы, встречающиеся в приложениях.

События

Все приложения с графическим интерфейсом являются событийно-ориентированными. События вызываются главным образом пользователем приложения. Однако, они могут быть вызваны другими средствами, к примеру подключением к Интернету, диспетчером окон или таймером. Когда мы вызываем метод exec_(), приложение входит в главный цикл. Главный цикл получает события и отправляет их объектам.

В модели событий имеются три участника:

  • Источник события
  • Объект события
  • Цель события

Источник события – это объект, состояние которого меняется. Он вызывает событие. Событие инкапсулирует изменение состояния в источнике события. Цель события – это объект, которому требуется уведомление. Объект источника события делегирует задачу обработки события цели события.

Для работы с событиями PyQt5 имеет уникальный механизм сигналов и слотов. Сигналы и слоты используются для связи между объектами. Сигнал срабатывает тогда, когда происходит конкретное событие. Слот может быть любой функцией. Слот вызывается, когда срабатывает его сигнал.

Сигналы и слоты

Это простой пример, демонстрирующий сигналы и слоты в PyQt5.

В этом примере, мы показываем QtGui.QLCDNumber и QtGui.QSlider. Мы меняем число lcd путём перемещения ползунка регулятора.

Здесь мы присоединяем сигнал valueChanged слайдера к слоту display числа lcd.

Отправитель – объект, который посылает сигнал. Получатель – объект, который получает сигнал. Слот – это метод, который реагирует на сигнал.

Переопределение обработчика события

События в PyQt5 часто обрабатываются путём переопределения обработчиков.

В этом примере, мы переопределяем обработчик события keyPressEvent().

Если мы нажимаем клавишу Esc, то приложение завершается.

Отправитель события

Иногда удобно знать, какой именно виджет является отправителем сигнала. Для этого PyQt5 имеет метод sender().

В нашем примере у нас есть две кнопки. В методе buttonClicked() мы определяем, какую из кнопок мы нажали с помощью метода sender().

Обе кнопки подключаются к одному слоту.

Мы определяем источник сигнала с помощью метода sender(). В строке состояния приложения, мы показываем метку нажатой кнопки.

Отправка сигналов

Объекты, создаваемые из QObject, могут посылать сигналы. В следующем примере, мы увидим, как мы может послать пользовательский сигнал.

Мы создаём новый сигнал, названный closeApp. Этот сигнал отправляется во время события нажатия кнопки мыши. Сигнал присоединяется к слоту close() класса QMainWindow.

Сигнал создаётся с помощью pyqtSignal() как атрибут внешнего класса Communicate.

Пользовательский сигнал closeApp присоединяется к слоту close() класса QMainWindow.

Когда мы кликаем на окне курсором мыши, посылается сигнал closeApp. Приложение завершается.

В этой части руководства PyQt5, мы рассмотрели сигналы и слоты.

Источник

Оцените статью