如何在特定的QHeaderView部分中结合样式表显示粗体文本

时间:2017-09-22 11:09:01

标签: qt qpainter qheaderview

我使用应用程序范围的样式表来改变我的QTableView外观。同时,我希望某些列标题具有粗体文本,具体取决于标题文本。为此,我从 QHeaderView 派生并实现了 paintSection 功能:

class BoldHeaderView : public QHeaderView
{
    Q_OBJECT

public:
    BoldHeaderView( Qt::Orientation orientation, QWidget* parent = 0 ) : QHeaderView( orientation, parent ) { }

    void addBoldColumn( QString column_name )
    {
        if ( !m_bold_columns.contains( column_name ) )
            m_bold_columns.append( column_name );
    }

protected:
    void paintSection( QPainter* p_painter, const QRect& rect, int logicalIndex ) const
    {
        QFont bold_font = p_painter->font();
        QString column_name = model()->headerData( logicalIndex, Qt::Horizontal, Qt::DisplayRole ).toString();

        if ( m_bold_columns.contains( column_name ) )
            bold_font.setBold( true );

        p_painter->setFont( bold_font );

        QHeaderView::paintSection( p_painter, rect, logicalIndex );
    }

private:
    QList<QString> m_bold_columns;
};

然后我将其设置为QTableView的horizo​​ntalHeader:

BoldHeaderView* p_bold_header = new BoldHeaderView( Qt::Horizontal );
p_bold_header->addBoldColumn( "Foo" );

m_p_table_view->setHorizontalHeader( p_bold_header );

我的样式表如下所示:

QTableView QHeaderView::section {
    font-family: "Segoe UI";
    background-color: white;
    border-style: none;
}

它在主要功能中应用于应用程序:

QApplication app(argc, argv);
[...]
app.setStyleSheet( style_sheet );

感谢 eyllanesc 我发现这与样式表有冲突。粗体字将始终被其中指定的任何内容覆盖。我需要找到一种结合两种方法的方法。

1 个答案:

答案 0 :(得分:0)

如何使用数据模型来管理它?

如果数据模型派生自QAbstractItemModel,则可以更改它的headerData方法。类似的东西:

QVariant MyDerivedModel::headerData(int section, Qt::Orientation orientation, int role) const
{
   //... things

   if(role == Qt::FontRole) 
   {
      //if the column (the section) is one of the "special" ones, set it to bold
      //return the desired QFont in bold
   }

}