Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Playmaker от Март 12, 2009, 19:23



Название: onDrawCell и TableWidget
Отправлено: 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!


Название: Re: onDrawCell и TableWidget
Отправлено: EhTemka от Март 12, 2009, 20:57
А что, если посмотреть в сторону делегатов - QAbstractItemDelegate и его наследники?


Название: Re: onDrawCell и TableWidget
Отправлено: BaltikS от Март 12, 2009, 20:57
Советую ознакомиться с технолгией модель-представление... А в вашем случае нужно уснаследоваться от QItemDelegate и отрисовать в нём всё что захотите, запихнув его потом в модель


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

Насколько я помню, делегат во вьювер "запихивается", так что можно обойтись и без модели, как таковой.


Название: Re: onDrawCell и TableWidget
Отправлено: BaltikS от Март 12, 2009, 21:49
да верно, написал не подумав...конечно во View  :)


Название: Re: onDrawCell и TableWidget
Отправлено: cresta от Март 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");