Russian Qt Forum
Декабрь 28, 2024, 01:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: А не баг ли в QListWidget я нашел?...  (Прочитано 3761 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июль 06, 2011, 23:40 »

простая вроде ситуация: QListWidget для списка файлов, приделываую кнопку Rename, сигнал от кнопки поступает в такой слот:

Код:
void EditWindow::on_renameProgButton_clicked()
{
    QListWidgetItem* item = ui->programsList->currentItem();
    if( item )
    {
        filename = item->text();
        item->setFlags( item->flags() | Qt::ItemIsEditable | Qt::ItemIsEnabled ); //***
        ui->programsList->editItem( item );
    }
}

окончание редактирования поля имени ловится вот таким слотом:

Код:
void EditWindow::itemWasChanged( QListWidgetItem *item )
{
    QFile::rename( filename, item->text() );
    item->setFlags( item->flags() | Qt::ItemIsSelectable );
}

соответственно в конструкторе EditWindow есть

Код:
connect( ui->programsList, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(itemWasChanged(QListWidgetItem*)) );

где ui->programsList очевидно QListWidget с именами файлов

вот приходит сигнал от кнопки, и на строке, где //*** БАБАХ... причем крепко так, отладчик показывает Ассемблер, а без отладчика просто все молча сворачивается

смотрю на это около получаса и не вижу где ошибка (на самом деле, уже в первом часу ночи, и после >14 часов работы), а поскольку не вижу, то начинаю просто убирать строки, пока не получаю работающий вариант

так вот работает, если не делать коннект - падения нет, строка редактируется, но, разумеется, результат редактирования ни на что не влияет

то есть, получается, что setFlags(); генерирует сигнал itemChanged(QListWidgetItem*), который попадает в слот, где есть еще один setFlags(); и дальше все хряпсь... так что-ли? но пардон, изменение флагов - это не изменение данных, сигнал обещали, когда данные меняются, а флаги - это управление самим Qt, но не изменение данных!

а не баг ли это??...

может, конечно, где-то еще есть косяк у меня под полуночь, но до этого момента все на ура работало, тестировал, ничего не падало
« Последнее редактирование: Июль 06, 2011, 23:42 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Июль 06, 2011, 23:50 »

да, именно так все и происходит - вставил строчку c qDebug

Код:
void EditWindow::itemWasChanged( QListWidgetItem *item )
{
    qDebug() << "itemWasChanged";
    QFile::rename( filename, item->text() );
    item->setFlags( item->flags() | Qt::ItemIsSelectable );
}

и в консоли водопад

itemWasChanged
itemWasChanged
....

и потом падение
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июль 06, 2011, 23:56 »

черт, в документации написано про это... вот что значит работать столько, все забыл
Записан

2^7-1 == 127, задумайтесь...
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июль 07, 2011, 00:16 »

Чтобы избежать бесконечного цикла, у вас всегда есть вариант проверять флаг перед установкой и ставить только по мере надобности, тогда будет не более 1 повторного вызова.
Ну или, как вариант, временно блокировать сигнал.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Июль 07, 2011, 00:20 »

да теперь то понятно, только еще проще - вообще убрать кнопку "переименовать", и разрешить редактирование имен файлов сразу...

все равно - логика тут нарушена, флаги не являются частью данных айтема, и либо они не должны выделять сигнал, либо должна быть возможность отличить почему сигнал пришел, то есть, должен быть еще параметр типа enum QGraphicsItem::GraphicsItemChange у itemWasChanged()

кстати, про рекурсию написано в документации буквально "в очень глубоком и темном подвале", в описании одного из значений этого самого enum QGraphicsItem::GraphicsItemChange, мелким шрифтом
« Последнее редактирование: Июль 07, 2011, 00:26 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Июль 07, 2011, 00:57 »

и еще косяк вижу, но сейчас уже спать пойду...

редактирование QListWidgetItem разрешено начинать по двойному клику и по нажатию клавиши Enter - и оно так и начинается по одному из этих событий

но вот сигнал itemActivated почему-то генерируется только при нажатии клавиши, а от мышиного дабл-клика - нифига нет

все-таки, похоже, напишу я баг-репорт...
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.147 секунд. Запросов: 23.