如何为 QTableWidget 行绘制边框?

Posted

技术标签:

【中文标题】如何为 QTableWidget 行绘制边框?【英文标题】:HowTo draw border for QTableWidget row? 【发布时间】:2011-09-14 12:42:05 【问题描述】:

我正在尝试以不同的方式为 QTableWidget 中的行设置边框,但所有解决方案都无法满足我的要求。我想要的只是围绕整行绘制一个矩形。我曾尝试QStyledItemDelegate 类,但这不是我的方式,因为委托仅用于项目[行、列],而不用于整行或整列。

这里是错误的解决方案:

/// @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 ) );

感谢您的帮助!

【问题讨论】:

您是否考虑过可能需要创建自己的视图?或者,创建一个委托来查看它正在绘制的索引的列,并绘制矩形的适当边。 【参考方案1】:

您的解决方案并没有太大错误。您只需要对绘制矩形的哪些边缘更有选择性:

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 );

希望这会有所帮助!

【讨论】:

@Caleb Huitt - cjhuitt & Clare Macrae 谢谢你的提示! :-)【参考方案2】:
  #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

sample output

希望这个简单的方法能有所帮助!!!

【讨论】:

添加一些解释,说明此答案如何帮助 OP 解决当前问题 paint( QPainter*painter... 这个方法对于绘制形状很有用,但是 qtableWidget 会显示数据 仅仅意味着我们使用这个方法来简化你的工作..使用 qss 样式表,我们可以像上面的方法一样给出边框。我还附上了示例输出。

以上是关于如何为 QTableWidget 行绘制边框?的主要内容,如果未能解决你的问题,请参考以下文章

Antd - 如何为表格行制作圆角边框?

Qt:在委托绘制事件中渲染时如何增加 QTablewidget?

如何为 QTableWidgetItem 设置“普通”或“平面”背景颜色

如何为小部件边框/阴影添加霓虹发光效果?

qtablewidget怎样设置表

QT编程,如何用代码实现 QTableWidget中滚动条的移动