如何为 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 行绘制边框?的主要内容,如果未能解决你的问题,请参考以下文章
Qt:在委托绘制事件中渲染时如何增加 QTablewidget?