Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexlogvinenkoit от Декабрь 28, 2011, 14:19



Название: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 14:19
Всем привет и с наступающим!

Подскажите, пожалуйста, как запретить пользователю сортировать содержимое Q3ListView, который разбит на несколько колонок?
И еще: заполнение Q3ListView происходит в отдельном потоке, поэтому кидаю в поток указатель на Q3ListView и создаю Q3ListViewItem. Тут все работает, только вот иногда моментально, а иногда с задержкой до 5 секунд. Как это можно решить?

Спасибо!


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 14:35
Нельзя из другого потока взаимодействовать с GUI!

Сортировка (http://developer.qt.nokia.com/doc/qt-4.8/q3listview.html#setSorting)


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 14:42
Очень даже можно и легко :)
Либо напрямую через указатель, либо через QMetaObject::invokeMethod(...).
Но проблема моя не в этом :)

С запретом сортировки разобрался, спасибо!

Со скоростью добавления item-а в listview можно как-то решить?


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 15:21
Нельзя из другого потока взаимодействовать с GUI напрямую через указатель.
Через invokeMethod хз. Наверное можно.

А если требуется по заданию, чтобы приложение падало и глючило, то можно. И легко.


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 15:38
Да ладно, приложение работает как часики, не падает, не глючит...

Есть в приложении QStackedWidget - там есть setCurrentIndex(int index), надо было из другого потока менять индекс, так я и познакомился с QMetaObject::invokeMethod(...). Работает, не глючит, на бажит, даже warnings не выдает.

Тут вопрос в другом, в Q3ListView записываются Q3ListViewItem-ы, так иногда пишет мгновенно, а иногда секунд через 5, но не более. Может его как-то принудительно рефрешить или чего-то еще?


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 16:08
Вот вам и нельзя! Все можно, главное мыслить не шаблонно!

Код:
ThreadFunc(Q3ListView * listView)
{
    ...
    new Q3ListViewItem(listView, ...); //Создаем item в Q3ListView
    QMetaObject::invokeMethod(listView, "repaint", Qt::QueuedConnection); //Перерисовуем Q3ListView
    ...
}

Всем спасибо!
И еще раз с наступающим!


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 16:56
Вот вам и нельзя! Все можно, главное мыслить не шаблонно!

Код:
ThreadFunc(Q3ListView * listView)
{
    ...
    new Q3ListViewItem(listView, ...); //Создаем item в Q3ListView
    QMetaObject::invokeMethod(listView, "repaint", Qt::QueuedConnection); //Перерисовуем Q3ListView
    ...
}
Так делать нельзя! Нельзя создавать GUI объекты нигде, кроме как в GUI-потоке. Лучше бы ты познакомился с документацией.

 QMetaObject::invokeMethod(listView, "repaint", Qt::QueuedConnection); //Перерисовуем Q3ListView
Тогда такие извращения будут не нужны.


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 17:01
Т.е. предлагаешь передавать данные в GUI-поток, например создать public функцию в виджете, уже там формировать Q3ListViewItem(listView, ...)?


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 17:04
Т.е. предлагаешь передавать данные в GUI-поток, например создать public функцию в виджете, уже там формировать Q3ListViewItem(listView, ...)?
Как ты понимаешь, если ты будешь по указателю вызывать функцию, ничего не поменяется.
Посмотри примеры. Гугол Gui QThread.

Из QThread эмит сигнала с данными в гуи его ловишь. Это же не трудно.


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 17:08
Ага, понял!
Создаем какой-то слот в GUI потоке, создаем поток и коннектим сигнал потока со слотом виджета, а уже в потоке посылаем сигнал (emit)...
Как-то так?


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 17:18
И зачем тебе Q3ListView? Почему не нормальный QListWidget? Судя по вопросу, ты с нуля пишешь приложение, а не адаптируешь что-то.


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 28, 2011, 17:27
QListView был изначально, только вот я с Model-View представлением не совсем разобрался, чтобы разбить данные по колонкам, а сроки поджимают :)
Разберусь, сделаю нормально с QListView или QListWidget... И потоки переделаю :)

Спасибо!


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: andrew.k от Декабрь 28, 2011, 17:53
Q3ListView - это класс для совместимости с Qt3. В новых проектах использовать его нет смысла.

QListView - с моделями
QListWidget - классический item-based виджет. он тебе и нужен.


Название: Re: Q3ListView запрет пользователю сортировать содержимое
Отправлено: alexlogvinenkoit от Декабрь 30, 2011, 13:58
Блин! Вот почему раньше на глаза не попался, я бы только его и использовал :)
Обязательно переделаю и с GUI потоком тоже разберусь :)

Огромное спасибо! Ну и с наступающим!