簡體   English   中英

如何在可滾動的QTableWidget中凍結水平標題?

[英]How can I have a frozen horizontal header in a scrollable QTableWidget?

我正在為我的應用程序( _tw )創建一個單列QTableWidget。 我希望這個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);

我希望水平標題與表的寬度相同,並且難以滾動。 當前情況並非如此:標題具有列的大小(大於屏幕上顯示的大小)。 由於標題文本是水平對齊的,因此未顯示,它隨滾動而移動。

您可以嘗試創建一個自定義類,將類頭區域應用於任何QAbstractScrollArea (包括QTableWidget ),並在tablewidget上設置視口頁邊距。 您無需弄亂標題不滾動就可以處理,但是如果您需要類似標題的行為,則需要手動進行。

未經測試的代碼:

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

然后在tablewidget上設置視口邊距,如下所示:

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

然后只需創建Header實例:

Header *header = new Header(_tw);

如果此代碼有效-Romha Korev將獲得榮譽。 我從他對這個問題的回答中得到了這個主意。

希望這可以幫助。

我嘗試過的所有其他解決方案都給了我一些像素間隙,這些間隙我覺得太明顯了。 我決定大膽嘗試,並創建一個專門用於解決此問題的自定義QWidget

基本上,我只是創建了QWidget僅包含QTableWidget且沒有標題的QWidget 為了使所有內容保持相同大小,我添加了一行,該行將保持空白,並由QPushButton隱藏。 出於相同的原因,我將此行的高度設為標題的高度。

在修改了QTableWidget的行為以便跳過第一行之后,我創建了一個以我的自定義小部件為父級的QPushButton 幸運的是,在我的應用程序中,它們具有與其他QHeader相同的外觀。 因為這是一個自定義窗口小部件,所以要使按鈕“位於”空行上方,請使用簡單的button->move(0, 2); 做到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM