Как отобразить полужирный текст в определенном разделе 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;
};

Затем я установил это как horizontalHeader QTableView:

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 я обнаружил, что это конфликтует с таблицей стилей. Жирный шрифт всегда будет перезаписан тем, что там указано. Мне нужно найти способ объединить оба метода.


person i know nothing    schedule 22.09.2017    source источник
comment
Я проверил ваш код, и он работает правильно   -  person eyllanesc    schedule 22.09.2017
comment
Странно. Я упустил тот факт, что использую таблицы стилей для всего приложения. Я отключу их и проверю снова.   -  person i know nothing    schedule 22.09.2017
comment
Да, похоже, дело в таблице стилей. Я обновляю вопрос.   -  person i know nothing    schedule 22.09.2017
comment
Покажите пример того, как вы применяете таблицу стилей.   -  person eyllanesc    schedule 22.09.2017
comment
Я разместил несколько таблиц стилей и все еще работаю, вы можете разместить пример таблицы стилей, которую вы используете.   -  person eyllanesc    schedule 22.09.2017
comment
Если я прокомментирую рассматриваемые части, это сработает. Это должна быть таблица стилей. Но я добавил это к вопросу.   -  person i know nothing    schedule 22.09.2017
comment
Как я уже сказал, я добавил следующий стиль: "QHeaderView::section {" "background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565);" "color: white;" "padding-left: 4px;" "border: 1px solid #6c6c6c;" "}" и работает: imgur.com/a/Eik1K, см. имя и идентификатор   -  person eyllanesc    schedule 22.09.2017


Ответы (1)


Как насчет использования модели данных, чтобы отвечать за это?

Если модель данных является производной от 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
   }

}
person pablo_worker    schedule 22.09.2017
comment
Мне нужно будет попробовать, конфликтует ли это с таблицей стилей. Спасибо за идею. - person i know nothing; 22.09.2017
comment
Есть идеи, как мне получить доступ к текущему шрифту заголовка? - person i know nothing; 22.09.2017
comment
Если вы не изменили шрифт по умолчанию, вы можете использовать { QFont boldFont; boldFont.setBold (истина); вернуть полужирный шрифт; } - person pablo_worker; 22.09.2017
comment
@pablo_worker Этот шрифт принадлежит системе, а не тому, который назначает таблицу стилей. - person eyllanesc; 22.09.2017
comment
Да, мне нужно было бы основывать свой жирный шрифт на уже измененном шрифте. - person i know nothing; 22.09.2017
comment
QHeaderView не использует роли стилей, поэтому это не работает. - person André; 21.11.2018