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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: onDrawCell и TableWidget  (Прочитано 3979 раз)
Playmaker
Гость
« : Март 12, 2009, 19:23 »

Здравствуйте!
Есть программа на Builder'е и Kylix'е. Надо переделать её на Qt. Много слышал о Qt, и вот мы встретились Подмигивающий .
Есть там такой StringGrid и его событие StringGrid1DrawCell(TObject *Sender, int ACol,  int ARow, TRect &Rect, TGridDrawState State). Я так понял QTableWidget и paintEvent(QPaintEvent * event) - это ихние аналоги в Qt.
Мне надо менять цвет текста, фон ячейки в фокусе, в выделенном состоянии в зависимости от текста, номера строки, столбца и состояния ячейки.У меня почти всё работает. Но я сделал это с помощью потомка QWindowsStyle, переопределяя метод drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ), где element = QStyle::PE_PanelItemViewItem. Но таблица у меня не одна, да и  в целом, по-моему, нелогично и неправильно так делать.

Пытался по аналогии сделать в paintEvent'е, но ничего не получается...
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::begin: Widget painting can only begin as a result of a paintEvent
...
Много экспериментировал. Вот последнее, что у меня не работает Улыбающийся
Код:
void MyTable::paintEvent(QPaintEvent * event)
{
    QPainter p(this);
    QStyleOptionViewItemV4 opt;
    opt.initFrom(this);
    if (opt.state & QStyle::State_Selected)
    {
        p.fillRect(opt.rect,QBrush(Qt::green));
    }
    else if (opt.text == "50")
    {
        QFont f(opt.font);
        f.setBold(true);
        p.setPen(Qt::red);
        p.drawText(opt.rect,opt.text);
    }
    else if (opt.index.row()%2 == 0)
    {
        p.fillRect(opt.rect,QBrush(Qt::lightGray));
    }
    else QTableWidget::paintEvent(event);
    // style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
}

Как сделать описанные мной выше действия в paintEvent'е? Надоело разбираться. Help me!
Записан
EhTemka
Гость
« Ответ #1 : Март 12, 2009, 20:57 »

А что, если посмотреть в сторону делегатов - QAbstractItemDelegate и его наследники?
Записан
BaltikS
Гость
« Ответ #2 : Март 12, 2009, 20:57 »

Советую ознакомиться с технолгией модель-представление... А в вашем случае нужно уснаследоваться от QItemDelegate и отрисовать в нём всё что захотите, запихнув его потом в модель
Записан
EhTemka
Гость
« Ответ #3 : Март 12, 2009, 21:00 »

Советую ознакомиться с технолгией модель-представление... А в вашем случае нужно уснаследоваться от QItemDelegate и отрисовать в нём всё что захотите, запихнув его потом в модель

Насколько я помню, делегат во вьювер "запихивается", так что можно обойтись и без модели, как таковой.
Записан
BaltikS
Гость
« Ответ #4 : Март 12, 2009, 21:49 »

да верно, написал не подумав...конечно во View  Улыбающийся
Записан
cresta
Гость
« Ответ #5 : Март 14, 2009, 02:04 »

Цитировать
QPainter::begin: Widget painting can only begin as a result of a paintEvent

рисовать надо не на виджете, а на его viewport:


Код:
void MyWidget::paintEvent ( QPaintEvent * e){
    QPainter painter(myWidget->viewport());
    painter.setPen(*myColor);
    painter.setFont(myFont);

    painter.drawText(e->rect(), Qt::AlignCenter|Qt::AlignVCenter, "bla-bla");
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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