Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Делегат с редактором QCheckBox


Автор: math64 6.10.2011, 14:31
Для bool создаётся редактор QCheckBox вместо стандартного QBooleanComboBox:
Код

void MainWindow::setItemValie(QTreeWidgetItem *item, const QVariant &value)
{
    item->setData(1, Qt::EditRole, value);
    if (value.type() == QVariant::Bool) {
        item->setCheckState(1,value.toBool() ? Qt::Checked : Qt::Unchecked);
    }
}

QWidget* Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QVariant data = index.model()->data(index, Qt::EditRole);
    switch (data.type()) {
    case QVariant::Bool: {
        QCheckBox* cb = new QCheckBox(parent);
        return cb;
    }
    default:
        return QStyledItemDelegate::createEditor(parent, option, index);
    }
}
void Delegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(index); editor->setGeometry(option.rect);
}

Но при этом чекбокс отображается прозрачным, чёрным текстом по верх белого текста true или false со сдвигом, квадратик с галочкой тоже двоится - некрасиво.
Как настроить правильно стиль у создаваемого чекбокса?

Автор: Alca 6.10.2011, 15:08
Может надо Delegate::paint(...) обрабатывать ?

Автор: math64 6.10.2011, 15:27
paint рисует ячейку, когда нет редактора - как она рисуется меня устраивает, т.е. выглядит как чекбокс
Если нужно поменять текст, достаточно переопределить displayText
когда добавляется редактор, он рисуется поверх;
но реальный чекбокс рисуется со сдвигом влево и вниз от того, что нарисовал paint - нужно определить только на сколько пикселей (а это число может зависеть от ОС, а я хочк чтобы работало везде) сдвигать и определить это в updateGeometry() - без него будет рисоваться два квадратика с галочкой, поскольку стандартно у редактора отбирают место под декорацию (иконку или галочку)
если добавить
Код

        cb->setAutoFillBackground(true);

чекбокс будет закрашивать всю область ячейки, но не в том стиле, что другие ячейки дерева.

Автор: math64 9.10.2011, 00:34
Кстати, описываемое смещеие редактора отностиельно прорисовки без редактора есть только в Linux (Ubunti 10.0), в Windows всё в порядке (в стилях по умолчанию)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)