[英]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.