Как нарисовать границу для строки QTableWidget? - PullRequest
1 голос
/ 14 сентября 2011

Я пытаюсь создать границу для строк в QTableWidget различными способами, но все решения не отвечают моим требованиям. Все, что я хочу, это нарисовать прямоугольник вокруг целого ряда . Я пробовал QStyledItemDelegate class, но это не мой путь, потому что делегаты используются только для элемента [row, column], а не для целых строк или столбцов.

Вот неправильное решение:

/// @brief Рисуем границу вокруг строки. 
class DrawBorderDelegate : public QStyledItemDelegate
{
public:
     DrawBorderDelegate( QObject* parent = 0 ) : QStyledItemDelegate( parent ) {}
     void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;

}; // DrawBorderDelegate

void DrawBorderDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
     QStyleOptionViewItem opt = option;

     painter->drawRect( opt.rect );

     QStyledItemDelegate::paint( painter, opt, index );  
}

И где-то в коде:

tableWidget->setItemDelegateForRow( row, new DrawBorderDelegate( this ) );

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Ваше решение было далеко не так.Вам просто нужно быть более избирательным в отношении того, какие края прямоугольника вы рисуете:

void DrawBorderDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
     const QRect rect( option.rect );

     painter->drawLine( rect.topLeft(), rect.topRight() );
     painter->drawLine( rect.bottomLeft(), rect.bottomRight() );

     // Draw left edge of left-most cell
     if ( index.column() == 0 )
         painter->drawLine( rect.topLeft(), rect.bottomLeft() );

     // Draw right edge of right-most cell
     if ( index.column() == index.model()->columnCount() - 1 )
         painter->drawLine( rect.topRight(), rect.bottomRight() );

     QStyledItemDelegate::paint( painter, option, index );
}

Надеюсь, это поможет!

0 голосов
/ 27 января 2017
  #include <QTableWidget>     
  QTableWidget* table = new QTableWidget();

  table->resize(400, 250);

  table->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
  table->setColumnCount(3);
  table->setRowCount(2);

  //Set Header Label Texts Here
  table->verticalHeader ()->hide();
  table->horizontalHeader()->hide();

  table->setItem(0,0,new QTableWidgetItem("CELL 1"));
  table->setItem(0,1,new QTableWidgetItem("CELL 2"));
  table->setItem(0,2,new QTableWidgetItem("CELL 3"));

  table->setItem(1,0,new QTableWidgetItem("CELL 4"));
  table->setItem(1,1,new QTableWidgetItem("CELL 5"));
  table->setItem(1,2,new QTableWidgetItem("CELL 6"));

  table->setEditTriggers(QAbstractItemView::NoEditTriggers);
  table->setFocusPolicy(Qt::NoFocus);
  table->setSelectionMode(QAbstractItemView::NoSelection);

  table-> setObjectName (QString :: fromUtf8 ("table_"));
  table->show();

Таблица стилей:

QTableWidget
{
    background-color : none;
    gridline-color: white;    // this border for rows and columns
    color:#ffffff;
}

QTableWidget#table_{
     border:1px solid #ffffff;   // this border for total table
}

пример вывода

enter image description here

Надеюсь этот простой способ поможет !!!

...