Как я могу установить стиль линии определенной ячейки в QTableView? - PullRequest
3 голосов
/ 27 апреля 2010

Я работаю с графическим интерфейсом QT. Я реализую простой шестнадцатеричный элемент управления редактирования с использованием QTableView. Моя первоначальная идея - использовать таблицу с семнадцатью столбцами. Каждая строка таблицы будет иметь 16 шестнадцатеричных байтов, а затем ASCII-представление этих данных в семнадцатом столбце. В идеале я хотел бы отредактировать / установить стиль семнадцатого столбца, чтобы в верхней и нижней частях каждой ячейки не было строк, чтобы текст был свободным и плавным. Каков наилучший способ добиться этого с помощью QTableView?

1 Ответ

4 голосов
/ 27 апреля 2010

Я мог бы подумать о нескольких способах делать то, что вам нужно; и то, и другое включало бы рисование пользовательской сетки, поскольку похоже, что нет прямого способа подключиться к процедуре рисования сетки класса QTableView:

1.Выключите стандартную сетку для вашей древовидной сетки, вызвав setShowGrid (false) и нарисуйте линии сетки для ячеек, которым они нужны, с помощью делегата элемента. Ниже приведен пример:

// custom item delegate to draw grid lines around cells
class CustomDelegate : public QStyledItemDelegate
{
public:
    CustomDelegate(QTableView* tableView);
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
private:
    QPen _gridPen;
};

CustomDelegate::CustomDelegate(QTableView* tableView)
{
    // create grid pen
    int gridHint = tableView->style()->styleHint(QStyle::SH_Table_GridLineColor, new QStyleOptionViewItemV4());
    QColor gridColor = static_cast<QRgb>(gridHint);
    _gridPen = QPen(gridColor, 0, tableView->gridStyle());
}

void CustomDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QStyledItemDelegate::paint(painter, option, index);

    QPen oldPen = painter->pen();
    painter->setPen(_gridPen);

    // paint vertical lines
    painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
    // paint horizontal lines 
    if (index.column()!=1) //<-- check if column need horizontal grid lines
        painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

    painter->setPen(oldPen);
}

// set up for your tree view:
ui->tableView->setShowGrid(false);
ui->tableView->setItemDelegate(new CustomDelegate(ui->tableView));

2.Создайте потомка QTableView и переопределите метод paintEvent . Там вы можете нарисовать свою собственную сетку или позволить базовому классу нарисовать ее, а затем нарисовать горизонтальные линии поверх сетки, используя цвет фона таблицы.

надеюсь, это поможет, с уважением

...