Как нарисовать кнопку в QStyledItemDelegate
От: sz36 Россия  
Дата: 17.04.20 09:39
Оценка:
Hi, All!

Стоит следующая задача — иметь в таблице модель-представление кнопку в некоторых ячейках. Для рисования использован следующий ход:

void MyDelegat::paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  //Закрашиваем фон, пишем текст
  // . . . 

  //Рисуем кнопку
  QPushButton btn;
  btn.setText(...);
  btn.setGeometry(...);
  btn.setAutoFillBackground(true);
  QPixmap map = btn.grab(); 
  painter->drawPixmap(btn.x(), btn.y(), map);
}


Код сильно упрощен: на самом деле теневая кнопка создается единожды в конструкторе MyDelegat, а по сигналу entered(QModelIndex) в ячейке создается уже нормальная кнопка по тем же координатам и подсовывается в качестве editor. Сути это не меняет. Все работает ништяк, за исключением одного момента — если у кнопки скруглены углы, то участки фона вокруг углов кнопки не прорисовываются, остаются белыми.

Есть ли способ решить эту проблему? Закрасить углы цветом фона, или м.б, есть другой способ нарисовать кнопку в делегате?
Re: Как нарисовать кнопку в QStyledItemDelegate
От: SaZ  
Дата: 17.04.20 16:25
Оценка: 6 (1)
Здравствуйте, sz36, Вы писали:

S>Hi, All!


S>Стоит следующая задача — иметь в таблице модель-представление кнопку в некоторых ячейках. Для рисования использован следующий ход:


S>
S>void MyDelegat::paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
S>{
S>  //Закрашиваем фон, пишем текст
S>  // . . . 

S>  //Рисуем кнопку
S>  QPushButton btn;
S>  btn.setText(...);
S>  btn.setGeometry(...);
S>  btn.setAutoFillBackground(true);
S>  QPixmap map = btn.grab(); 
S>  painter->drawPixmap(btn.x(), btn.y(), map);
S>}
S>

S>...

Здравствуйте. Не стоит так делать. Берите у родителя текущий QStyle и рисуйте через него QStyle::drawControl с флагом CE_PushButton. Ну и вообще почитайте хэлпы по QStyle .
Можете посмотреть мой пример тут.
Re[2]: Как нарисовать кнопку в QStyledItemDelegate
От: sz36 Россия  
Дата: 20.04.20 11:11
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Берите у родителя текущий QStyle и рисуйте через него QStyle::drawControl с флагом CE_PushButton.


Чего-то не получается. Сделал все, как в Вашем примере, кнопка рисуется, но дефолтным стилем (с прямыми углами), а не тем, что я задал при старте приложения через App.setStyleSheet(...). Стиль пробовал брать и через QApplication::style(), и через listView->style() — результат одинаков. А способом из первого сообщения заданный мной стиль используется.

Что я делаю не так?
Re[3]: Как нарисовать кнопку в QStyledItemDelegate
От: sz36 Россия  
Дата: 21.04.20 08:23
Оценка: 3 (1)
Разобрался, если кому-то будет интересно. Как выяснилось, чтобы стиль применялся, нужно в вызове QApplication::style()->drawControl(QStyle::CE_PushButtonб ...) передавать и рисуемый контрол как четвертый пар-р (который по дефолту NULL)
Re[4]: Как нарисовать кнопку в QStyledItemDelegate
От: SaZ  
Дата: 25.04.20 20:59
Оценка:
Здравствуйте, sz36, Вы писали:

S>Разобрался, если кому-то будет интересно. Как выяснилось, чтобы стиль применялся, нужно в вызове QApplication::style()->drawControl(QStyle::CE_PushButtonб ...) передавать и рисуемый контрол как четвертый пар-р (который по дефолту NULL)


Вообще раньше я ловил баги при использовании кастомных QSS и подобным рисованием. В оригинальном сообщении вы это не упомянули. Точно не вспомню что именно, но мне приходилось городить свои QProxyStyle для кастомизации.
P.S. Не отвечал, потому что в больницу с электросамоката попал. Хорошо что вы разобрались.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.