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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q3ListView запрет пользователю сортировать содержимое  (Прочитано 5505 раз)
alexlogvinenkoit
Гость
« : Декабрь 28, 2011, 14:19 »

Всем привет и с наступающим!

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

Спасибо!
Записан
andrew.k
Гость
« Ответ #1 : Декабрь 28, 2011, 14:35 »

Нельзя из другого потока взаимодействовать с GUI!

Сортировка
Записан
alexlogvinenkoit
Гость
« Ответ #2 : Декабрь 28, 2011, 14:42 »

Очень даже можно и легко Улыбающийся
Либо напрямую через указатель, либо через QMetaObject::invokeMethod(...).
Но проблема моя не в этом Улыбающийся

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

Со скоростью добавления item-а в listview можно как-то решить?
« Последнее редактирование: Декабрь 28, 2011, 14:48 от alexlogvinenkoit » Записан
andrew.k
Гость
« Ответ #3 : Декабрь 28, 2011, 15:21 »

Нельзя из другого потока взаимодействовать с GUI напрямую через указатель.
Через invokeMethod хз. Наверное можно.

А если требуется по заданию, чтобы приложение падало и глючило, то можно. И легко.
« Последнее редактирование: Декабрь 28, 2011, 15:31 от andrew.k » Записан
alexlogvinenkoit
Гость
« Ответ #4 : Декабрь 28, 2011, 15:38 »

Да ладно, приложение работает как часики, не падает, не глючит...

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

Тут вопрос в другом, в Q3ListView записываются Q3ListViewItem-ы, так иногда пишет мгновенно, а иногда секунд через 5, но не более. Может его как-то принудительно рефрешить или чего-то еще?
Записан
alexlogvinenkoit
Гость
« Ответ #5 : Декабрь 28, 2011, 16:08 »

Вот вам и нельзя! Все можно, главное мыслить не шаблонно!

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

Всем спасибо!
И еще раз с наступающим!
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 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
Тогда такие извращения будут не нужны.
Записан
alexlogvinenkoit
Гость
« Ответ #7 : Декабрь 28, 2011, 17:01 »

Т.е. предлагаешь передавать данные в GUI-поток, например создать public функцию в виджете, уже там формировать Q3ListViewItem(listView, ...)?
Записан
andrew.k
Гость
« Ответ #8 : Декабрь 28, 2011, 17:04 »

Т.е. предлагаешь передавать данные в GUI-поток, например создать public функцию в виджете, уже там формировать Q3ListViewItem(listView, ...)?
Как ты понимаешь, если ты будешь по указателю вызывать функцию, ничего не поменяется.
Посмотри примеры. Гугол Gui QThread.

Из QThread эмит сигнала с данными в гуи его ловишь. Это же не трудно.
Записан
alexlogvinenkoit
Гость
« Ответ #9 : Декабрь 28, 2011, 17:08 »

Ага, понял!
Создаем какой-то слот в GUI потоке, создаем поток и коннектим сигнал потока со слотом виджета, а уже в потоке посылаем сигнал (emit)...
Как-то так?
Записан
andrew.k
Гость
« Ответ #10 : Декабрь 28, 2011, 17:18 »

И зачем тебе Q3ListView? Почему не нормальный QListWidget? Судя по вопросу, ты с нуля пишешь приложение, а не адаптируешь что-то.
Записан
alexlogvinenkoit
Гость
« Ответ #11 : Декабрь 28, 2011, 17:27 »

QListView был изначально, только вот я с Model-View представлением не совсем разобрался, чтобы разбить данные по колонкам, а сроки поджимают Улыбающийся
Разберусь, сделаю нормально с QListView или QListWidget... И потоки переделаю Улыбающийся

Спасибо!
Записан
andrew.k
Гость
« Ответ #12 : Декабрь 28, 2011, 17:53 »

Q3ListView - это класс для совместимости с Qt3. В новых проектах использовать его нет смысла.

QListView - с моделями
QListWidget - классический item-based виджет. он тебе и нужен.
Записан
alexlogvinenkoit
Гость
« Ответ #13 : Декабрь 30, 2011, 13:58 »

Блин! Вот почему раньше на глаза не попался, я бы только его и использовал Улыбающийся
Обязательно переделаю и с GUI потоком тоже разберусь Улыбающийся

Огромное спасибо! Ну и с наступающим!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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