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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как рисовать комбобокс в таблице, чтобы он реагировал на события мыши  (Прочитано 4995 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Август 20, 2021, 09:32 »

Всем привет!
У меня установлена собствення фабрика редакторов. Сейчас имею такой метод рисования:
Код
C++ (Qt)
void CommonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
   std::unique_ptr<QWidget> editor {QStyledItemDelegate::createEditor(nullptr, option, index)};
   if (auto *comboBox = dynamic_cast<QComboBox *>(editor.get())) {
       auto opt = option;
       initStyleOption(&opt, index);
 
       comboBox->setEnabled(index.flags() & Qt::ItemIsEditable);
 
       QStyleOptionComboBox cmbOpt;
       cmbOpt.initFrom(comboBox);
       cmbOpt.rect = opt.rect;
       cmbOpt.currentText = opt.text;
 
       const auto decoration = index.model()->data(index, Qt::DecorationRole);
       if (decoration.type() == QVariant::Icon) {
           cmbOpt.currentIcon = decoration.value<QIcon>();
           cmbOpt.iconSize = comboBox->iconSize();
       }
 
       QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &cmbOpt, painter);
       QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &cmbOpt, painter);
       return;
   }
   return QStyledItemDelegate::paint(painter, option, index);
}
 

Комбо в таблицу выводится, но вот он какой-то не живой. Обычно виджет как-то реагирует на наведение мыши, на покидание мыши виджета. Интересно, как можно было бы достичь такого же эффекта не сильно много внося изменений в текущий код

Пока что видится решение - наследоваться от AbstractView и связывать события мыши с делегатом + использовать какие-то флаги рисования. Но может есть что-то попроще?

Я ещё рассматривал вариант QAbstractItemView::setIndexWidget, но кажется, что он достаточно геморойный для меня, т.к. для отображения используется 3 класса моделей: фильтрующая->модель-массив однотипных моделей->модель элемент массива
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Август 20, 2021, 09:42 »

Я ещё накидал упрощённый пример, с которым можно было бы поразвлекаться https://gitlab.com/dsbabkov/PaintComboBoxOnView
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Сентябрь 15, 2021, 13:56 »

Делай через делегат. Я так добавлял много виджетов в ячейки, и все прекрасно работало
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Сентябрь 16, 2021, 10:14 »

В итоге сделал через делегат и метод рисования. Ещё хотелось от комбо бокса оставить только кнопку, но в таком случае визуально стиль висты меняется на стиль win98. Заиспользовал fusion, чтобы приятнее кнопка выглядела
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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