Как получить замороженный горизонтальный заголовок в прокручиваемом QTableWidget? - PullRequest
0 голосов
/ 09 июля 2019

Я создаю QTableWidget с одним столбцом для своего приложения (_tw).Я хочу, чтобы этот QTableWidget можно было прокручивать как по вертикали, так и по горизонтали.Я спрятал вертикальный заголовок, но мне нужен горизонтальный заголовок.Проблема в том, что я не могу получить «замороженный» (нечувствительный к горизонтальной прокрутке) горизонтальный заголовок, и текст этого заголовка часто скрыт в прокрутке.Кроме того, после вертикальной полосы прокрутки я вижу пиксели моего горизонтального заголовка, что является нежелательным.

Я пытался решить проблему по-другому, поскольку я уже пытался сделать горизонтальную прокрутку этой таблицы.Я безуспешно пытался перемещать заголовок при каждом перемещении полосы прокрутки.Даже если я потерпел неудачу, это больше похоже на обходной путь, чем на решение.

_tw->setHorizontalScroolBarPolicy(Qt::ScrollBarAlwaysOn);
_tw->setHorizontalScroolMode(QAbstractItemView::ScrollPerPixel);
_tw->verticalHeader()->hide();
_tw->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
_tw->horizontalHeader()->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
_tw->horizontalHeader()->setFixedHeight(_headerHeight);
_tw->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);

_tw->horizontalHeader()->setFixedWitdh(_tableWidth);
_tw->setFixedWidth(_tableWidth);

_tw->setColumnWidth(0, _tableWidth + _offset);

Я ожидаю, что горизонтальный заголовок будет на той же ширине таблицы и нечувствителен для прокрутки.В настоящее время это не так: заголовок имеет размер столбца (больше того, что отображается на экране).Поскольку текст заголовка выровнен по горизонтали, он не отображается и перемещается вместе со свитком.

1 Ответ

1 голос
/ 09 июля 2019

Вы можете попытаться создать пользовательский класс, который будет применять область, подобную заголовку, к любому QAbstractScrollArea (включая QTableWidget) и установить поля области просмотра в вашем табличном виджете.Вам не нужно манипулировать заголовком, не прокручивая его, но если вам нужно какое-то поведение, похожее на заголовок, вам придется делать это вручную.

Непроверенный код:

class Header: public QWidget
{
public:
    Header(QAbstractScrollArea* parent=nullptr): QWidget(parent)
    {
        setFixedSize(parent->width(), 40);
    }

    virtual void paintEvent(QPaintEvent* event)
    {
        QPainter painter(this);
        QFont font("Arial");
        QFontMetrics fm(font);
        QRect txtRect;
        QString txt = "Header_name";
        txtRect = fm.boundingRect(txt).trabslated(dx, dy);//translate it to position you want
        painter.setFont(font);
        painter.painter.drawText(txtRect, txt);
    }
};

Тогдаустановите поля видового экрана на вашем табличном виджете, примерно так:

_tw->setViewportMargins(0, 40, 0, 0);

Затем просто создайте экземпляр Header:

Header *header = new Header(_tw);

Если этот код работает - Ромха Корев получает кредит.Я взял идею из его ответа на этот вопрос .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...