Название: А не баг ли в QListWidget я нашел?... Отправлено: Гурман от Июль 06, 2011, 23:40 простая вроде ситуация: QListWidget для списка файлов, приделываую кнопку Rename, сигнал от кнопки поступает в такой слот:
Код: void EditWindow::on_renameProgButton_clicked() окончание редактирования поля имени ловится вот таким слотом: Код: void EditWindow::itemWasChanged( QListWidgetItem *item ) соответственно в конструкторе EditWindow есть Код: connect( ui->programsList, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(itemWasChanged(QListWidgetItem*)) ); где ui->programsList очевидно QListWidget с именами файлов вот приходит сигнал от кнопки, и на строке, где //*** БАБАХ... причем крепко так, отладчик показывает Ассемблер, а без отладчика просто все молча сворачивается смотрю на это около получаса и не вижу где ошибка (на самом деле, уже в первом часу ночи, и после >14 часов работы), а поскольку не вижу, то начинаю просто убирать строки, пока не получаю работающий вариант так вот работает, если не делать коннект - падения нет, строка редактируется, но, разумеется, результат редактирования ни на что не влияет то есть, получается, что setFlags(); генерирует сигнал itemChanged(QListWidgetItem*), который попадает в слот, где есть еще один setFlags(); и дальше все хряпсь... так что-ли? но пардон, изменение флагов - это не изменение данных, сигнал обещали, когда данные меняются, а флаги - это управление самим Qt, но не изменение данных! а не баг ли это??... может, конечно, где-то еще есть косяк у меня под полуночь, но до этого момента все на ура работало, тестировал, ничего не падало Название: Re: А не баг ли в QListWidget я нашел?... Отправлено: Гурман от Июль 06, 2011, 23:50 да, именно так все и происходит - вставил строчку c qDebug
Код: void EditWindow::itemWasChanged( QListWidgetItem *item ) и в консоли водопад itemWasChanged itemWasChanged .... и потом падение Название: Re: А не баг ли в QListWidget я нашел?... Отправлено: Гурман от Июль 06, 2011, 23:56 черт, в документации написано про это... вот что значит работать столько, все забыл
Название: Re: А не баг ли в QListWidget я нашел?... Отправлено: LisandreL от Июль 07, 2011, 00:16 Чтобы избежать бесконечного цикла, у вас всегда есть вариант проверять флаг перед установкой и ставить только по мере надобности, тогда будет не более 1 повторного вызова.
Ну или, как вариант, временно блокировать сигнал. Название: Re: А не баг ли в QListWidget я нашел?... Отправлено: Гурман от Июль 07, 2011, 00:20 да теперь то понятно, только еще проще - вообще убрать кнопку "переименовать", и разрешить редактирование имен файлов сразу...
все равно - логика тут нарушена, флаги не являются частью данных айтема, и либо они не должны выделять сигнал, либо должна быть возможность отличить почему сигнал пришел, то есть, должен быть еще параметр типа enum QGraphicsItem::GraphicsItemChange у itemWasChanged() кстати, про рекурсию написано в документации буквально "в очень глубоком и темном подвале", в описании одного из значений этого самого enum QGraphicsItem::GraphicsItemChange, мелким шрифтом Название: Re: А не баг ли в QListWidget я нашел?... Отправлено: Гурман от Июль 07, 2011, 00:57 и еще косяк вижу, но сейчас уже спать пойду...
редактирование QListWidgetItem разрешено начинать по двойному клику и по нажатию клавиши Enter - и оно так и начинается по одному из этих событий но вот сигнал itemActivated почему-то генерируется только при нажатии клавиши, а от мышиного дабл-клика - нифига нет все-таки, похоже, напишу я баг-репорт... |