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. Сути это не меняет. Все работает ништяк, за исключением одного момента — если у кнопки скруглены углы, то участки фона вокруг углов кнопки не прорисовываются, остаются белыми.
Есть ли способ решить эту проблему? Закрасить углы цветом фона, или м.б, есть другой способ нарисовать кнопку в делегате?
Здравствуйте, 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
.
Можете посмотреть мой пример
тут.
Здравствуйте, SaZ, Вы писали:
SaZ>Берите у родителя текущий QStyle и рисуйте через него QStyle::drawControl с флагом CE_PushButton.
Чего-то не получается. Сделал все, как в Вашем примере, кнопка рисуется, но дефолтным стилем (с прямыми углами), а не тем, что я задал при старте приложения через App.setStyleSheet(...). Стиль пробовал брать и через QApplication::style(), и через listView->style() — результат одинаков. А способом из первого сообщения заданный мной стиль используется.
Что я делаю не так?
Разобрался, если кому-то будет интересно. Как выяснилось, чтобы стиль применялся, нужно в вызове QApplication::style()->drawControl(QStyle::CE_PushButtonб ...) передавать и рисуемый контрол как четвертый пар-р (который по дефолту NULL)