Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
В Qt Designer я создал форму, на которую поместил QlistWidget для отображения хода обработки:

from PyQt5 import QtWidgets, uic
from Database import Manager
from MyLib import Events, GUI
import Forms, General
 
class Form(QtWidgets.QWidget):
 
    def __init__(self, parent: QtWidgets.QMainWindow):
        QtWidgets.QWidget.__init__(self)
         
        ClassForm, _ = uic.loadUiType(Forms.Directory + 'CreateDatabase.ui')    
        self.ui = ClassForm()
        self.ui.setupUi(self)
        self.parent = parent
         
        #name of form
        self.setWindowTitle('Form for creating database')
        self.widget = QtWidgets.QWidget(self)
          
        layoutV = QtWidgets.QVBoxLayout()
        layoutV.addWidget(self.ui.label)
        layoutV.addWidget(self.ui.ButtonCreateDatabase)
        layoutV.addWidget(self.ui.MessageList)
         
        self.widget.setLayout(layoutV)
        self.setLayout(layoutV)
            
        self.ui.ButtonCreateDatabase.clicked.connect(self.CreateDatabase)
   
    ...
         
    def event(self, current_event: Events.EventForMessageList) -> bool:
        if current_event.type() !=  General.type_event:
            return False
          
        current_object = self.ui.MessageList
        current_object.addItem(current_event.message)
        return True


Форма отлично создается, во время хода выполнения ей прибывают события нужного типа с непустыми значениями в поле message, они без ошибок обрабатываются, но в QListWidget новых строк не появляется. Это поле всегда остается полностью пустым.

Почему?
4 фев 19, 17:33    [21801469]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Интерфейс оживляю такой конструкцией:
q_app = QtWidgets.QApplication.instance()
q_app.processEvents();


Причем обработка закончена и интерфейс должен отрисоваться без дополнительных действий, но поле списка остается пустым.
5 фев 19, 09:15    [21801703]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Самое прикольное, что количество невидимых элементов в списке растет! Этот код возвращает постоянно увеличивающееся значение:
quantity = self.ui.MessageList.count()


Что за магия?
5 фев 19, 09:54    [21801719]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
причем список реально хранит значения, потому что конструкции типа:
self.ui.MessageList.item(quantity-1).text()
self.ui.MessageList.item(quantity-2).text()


возвращают корректные значения! То есть данные в списке содержаться, но почему- то не отображаются (хотя повторюсь, интерфейс "живой").
5 фев 19, 10:24    [21801754]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
Лысый дядька
Member

Откуда:
Сообщений: 283
AlekseySQL,

Алексей, вот как вы считаете, вы дали достаточно информации, чтобы кто-то, кто хотел бы вам помочь, мог бы воспроизвести вашу программу на своей машине?
5 фев 19, 10:41    [21801770]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Лысый дядька
AlekseySQL,

Алексей, вот как вы считаете, вы дали достаточно информации, чтобы кто-то, кто хотел бы вам помочь, мог бы воспроизвести вашу программу на своей машине?


Kubuntu 18.10 x64, Python 3.7.2, PyQt 5.11.3
PyQt- кроссплатформенный фреймворк (т.е. не зависит от платформы) с очень редким обновлением (т.е. практически у всех всегда стоит самая последняя версия).
5 фев 19, 10:51    [21801777]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Нашел!

Оказывается надо форму немного изменить в размерах и элементы начинают отображаться :) Ведь после добавления элемента в список я оживляю форму с помощью:

q_app = QtWidgets.QApplication.instance()
q_app.processEvents();


Как кошерно оживлять форму? Неужели надо второй процесс забацать?
5 фев 19, 10:56    [21801778]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
Лысый дядька
Member

Откуда:
Сообщений: 283
AlekseySQL
Kubuntu 18.10 x64, Python 3.7.2, PyQt 5.11.3
PyQt- кроссплатформенный фреймворк (т.е. не зависит от платформы) с очень редким обновлением (т.е. практически у всех всегда стоит самая последняя версия).


Я спрошу еще раз. Может быть я как-то непонятно спрашиваю? Вот, Алексей, если я скопирую ваш код, который вы выложили в стартовом посте, и сохраню его в файл с именем test_aleksey_super_code.py, и запущу его в консоли
mycomp:~$ python test_aleksey_super_code.py
я смогу увидеть суть вашей проблемы?
5 фев 19, 11:05    [21801783]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Лысый дядька
AlekseySQL
Kubuntu 18.10 x64, Python 3.7.2, PyQt 5.11.3
PyQt- кроссплатформенный фреймворк (т.е. не зависит от платформы) с очень редким обновлением (т.е. практически у всех всегда стоит самая последняя версия).


Я спрошу еще раз. Может быть я как-то непонятно спрашиваю? Вот, Алексей, если я скопирую ваш код, который вы выложили в стартовом посте, и сохраню его в файл с именем test_aleksey_super_code.py, и запущу его в консоли
mycomp:~$ python test_aleksey_super_code.py
я смогу увидеть суть вашей проблемы?


Нет, не сможете, потому что я спрашиваю об ошибке в работе интерфейса и не предоставляю бизнес- логику приложения, чтобы сфокусировать внимание на ошибке.
5 фев 19, 11:09    [21801788]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
Лысый дядька
Member

Откуда:
Сообщений: 283
AlekseySQL
Нет, не сможете


А что именно вам мешает сделать минимальный рабочий пример, который отражает суть вашей проблемы, чтобы тот человек, который захочет вам помочь, хотя смог увидеть в дебаггере сущности, про которые идет речь? Да даже не в дебаггере, а просто увидеть форму глазами? В вашей программе нет даже кода, который создает инстанс класса, надо как-то догадываться, чего вы там кодите вообще? Алексей, это же крайне просто: есть проблема, которая очень просто локализуется - вот, дескать, есть форма с одним списком, и я в этот список программно добавляю строки, а они не добавляются. Ну так и дайте народу форму с одним списком и самодостаточный код, чтобы каждый мог это воспроизвести.
5 фев 19, 11:18    [21801800]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Поместил рабочую процедуру в отдельный поток, но ситуация не поменялась!

from PyQt5 import QtWidgets, uic
import Forms, General
import threading, time

class Form(QtWidgets.QWidget):

    def __init__(self, parent: QtWidgets.QMainWindow):
        QtWidgets.QWidget.__init__(self)
        
        ClassForm, _ = uic.loadUiType(Forms.Directory + 'CreateDatabase.ui')    
        self.ui = ClassForm()
        self.ui.setupUi(self)
        self.parent = parent
        
        #name of form
        self.setWindowTitle('Form for creating database')
        self.widget = QtWidgets.QWidget(self)
         
        layoutV = QtWidgets.QVBoxLayout()
        layoutV.addWidget(self.ui.label)
        layoutV.addWidget(self.ui.ButtonCreateDatabase)
        layoutV.addWidget(self.ui.MessageList)
        
        self.widget.setLayout(layoutV)
        self.setLayout(layoutV)
           
        self.ui.ButtonCreateDatabase.clicked.connect(self.CreateDatabase)

    def do(self):
        for i in range(10):
            Events.message_error(str(i) + " Hop, hey! La- la- ley!")
            time.sleep(1)
        
    def CreateDatabase(self) -> None:
        threading.Thread(target=self.do).start()

   def event(self, current_event: Events.EventForMessageList) -> bool:
        if current_event.type() !=  General.type_event:
            return False
         
        self.ui.MessageList.addItem(current_event.message)
        return True


События продолжают прилетать, но на форме отображаются только если параллельно менять ее размер.
5 фев 19, 13:14    [21801889]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Причем это не проблема QListWidget: попробовал тот же текст устанавливать кнопке, и теперь процедура получения события выглядит так:
def event(self, current_event: Events.EventForMessageList) -> bool:
        if current_event.type() !=  General.type_event:
            return False
         
        self.ui.MessageList.addItem(current_event.message)
        self.ui.ButtonCreateDatabase.setText(current_event.message)
        
        return True


Та же проблема! Кнопка начинает менять текст только если я параллельно с выполнением обработки изменяю размеры формы...
5 фев 19, 13:25    [21801903]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Решил уйти от QtDesigner и форму создал чисто с помощью кода:

class Form(QtWidgets.QWidget):
    def __init__(self, parent):
        QtWidgets.QWidget.__init__(self)
         
        #name of form
        self.setWindowTitle('Form for creating database')
        
        self.label = QtWidgets.QLabel('Обработка создания базы данных')
        self.ButtonCreateDatabase = QtWidgets.QPushButton("Создать")
        self.MessageList = QtWidgets.QListWidget()
          
        self.layoutV = QtWidgets.QVBoxLayout()
        self.layoutV.addWidget(self.label)
        self.layoutV.addWidget(self.ButtonCreateDatabase)
        self.layoutV.addWidget(self.MessageList)
         
        self.setLayout(self.layoutV)
            
        self.ButtonCreateDatabase.clicked.connect(self.CreateDatabase)
   
    def do(self):
        for i in range(10):
            Events.message_error(str(i) + " Hop, Hey! La-la-ley!")
             
            q_app = QtWidgets.QApplication.instance()
            q_app.processEvents();
     
            time.sleep(1)
         
    def CreateDatabase(self) -> None:
        threading.Thread(target=self.do).start()
         
    def event(self, current_event: Events.EventForMessageList) -> bool:
        if current_event.type() !=  General.type_event:
            return False
          
        self.MessageList.addItem(current_event.message)
        self.ButtonCreateDatabase.setText(current_event.message)
         
        q_app = QtWidgets.QApplication.instance()
        q_app.processEvents();
         
        return True


Результат точно такой же как и раньше: список и кнопка не обновляются пока я не начинаю менять размеры окна....
5 фев 19, 15:25    [21801996]     Ответить | Цитировать Сообщить модератору
 Re: PyQt: не появляются строки в QListWidget...  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Для будущих поколений оставлю итоговое решение:

class MyThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
        
    def run(self):
        for i in range(1, 11):
            self.sleep(1)
            
            # Передача данных из потока через событие
            Events.message_error(str(i) + " Hop, Hey! La-la-ley!")

class MyList(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        QtWidgets.QListWidget.__init__(self, parent)

    def customEvent(self, current_event: Events.EventForMessageList):
        if current_event.type() != General.type_event:
            return False
        
        self.addItem(current_event.message)
                            
class Form(QtWidgets.QWidget):
    def __init__(self, parent):
        QtWidgets.QWidget.__init__(self)
         
        #name of form
        self.setWindowTitle('Form for creating database')
        
        self.label = QtWidgets.QLabel('Обработка создания базы данных')
        self.ButtonCreateDatabase = QtWidgets.QPushButton("Создать")
        self.MessageList = MyList()
          
        self.layoutV = QtWidgets.QVBoxLayout()
        self.layoutV.addWidget(self.label)
        self.layoutV.addWidget(self.ButtonCreateDatabase)
        self.layoutV.addWidget(self.MessageList)
          
        self.setLayout(self.layoutV)
            
        self.thread = MyThread()
        
        self.ButtonCreateDatabase.clicked.connect(self.on_clicked)

    def on_clicked(self):
        General.generate_type_event()
        General.event_receiver = self.MessageList
        
        self.thread.start()
5 фев 19, 17:16    [21802093]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить