RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1394073
Accepted
Konstantin
Konstantin
Asked:2022-08-27 16:04:37 +0000 UTC2022-08-27 16:04:37 +0000 UTC 2022-08-27 16:04:37 +0000 UTC

使 QTableWidget 的第一列永久可见(固定在滚动上)

  • 772

有一张宽大的桌子。如何使滚动的第一列始终可见?

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.table_data = QtWidgets.QTableWidget(1, 20, self)
        self.setCentralWidget(self.table_data)


app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

问题可视化

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-08-27T17:20:52Z2022-08-27T17:20:52Z

    试试这样:

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.Qt import *
    
    
    class FreezeTableWidget(QTableView):
        def __init__(self, model):
            super(FreezeTableWidget, self).__init__()
            self.setModel(model)
            self.frozenTableView = QTableView(self)
            self.init()
            self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
            self.verticalHeader().sectionResized.connect(self.updateSectionHeight)
            self.frozenTableView.verticalScrollBar().valueChanged.connect(
                self.verticalScrollBar().setValue)
            self.verticalScrollBar().valueChanged.connect(
                self.frozenTableView.verticalScrollBar().setValue)
    
        def init(self):
            self.frozenTableView.setModel(self.model())
            self.frozenTableView.setFocusPolicy(Qt.NoFocus)
            self.frozenTableView.verticalHeader().hide()
            self.frozenTableView.horizontalHeader().setSectionResizeMode(
                    QHeaderView.Fixed)
            self.viewport().stackUnder(self.frozenTableView)
    
            self.frozenTableView.setStyleSheet('''
                QTableView { border: none;
                             background-color: #8EDE21;
                             selection-background-color: #999;
                }''') # for demo purposes
    
            self.frozenTableView.setSelectionModel(self.selectionModel())
            for col in range(1, self.model().columnCount()):
                self.frozenTableView.setColumnHidden(col, True)
            self.frozenTableView.setColumnWidth(0, self.columnWidth(0))
            self.frozenTableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.frozenTableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.frozenTableView.show()
            self.updateFrozenTableGeometry()
            self.setHorizontalScrollMode(self.ScrollPerPixel)
            self.setVerticalScrollMode(self.ScrollPerPixel)
            self.frozenTableView.setVerticalScrollMode(self.ScrollPerPixel)
    
        def updateSectionWidth(self, logicalIndex, oldSize, newSize):
            if self.logicalIndex == 0:
                self.frozenTableView.setColumnWidth(0, newSize)
                self.updateFrozenTableGeometry()
    
        def updateSectionHeight(self, logicalIndex, oldSize, newSize):
            self.frozenTableView.setRowHeight(logicalIndex, newSize)
    
        def resizeEvent(self, event):
            super(FreezeTableWidget, self).resizeEvent(event)
            self.updateFrozenTableGeometry()
    
        def moveCursor(self, cursorAction, modifiers):
            current = super(FreezeTableWidget, self).moveCursor(cursorAction, modifiers)
            if (cursorAction == self.MoveLeft and
                    self.current.column() > 0 and
                    self.visualRect(current).topLeft().x() <
                        self.frozenTableView.columnWidth(0)):
                newValue = (self.horizontalScrollBar().value() +
                            self.visualRect(current).topLeft().x() -
                            self.frozenTableView.columnWidth(0))
                self.horizontalScrollBar().setValue(newValue)
            return current
    
        def scrollTo(self, index, hint):
            if index.column() > 0:
                super(FreezeTableWidget, self).scrollTo(index, hint)
    
        def updateFrozenTableGeometry(self):
            self.frozenTableView.setGeometry(
                    self.verticalHeader().width() + self.frameWidth(),
                    self.frameWidth(), self.columnWidth(0),
                    self.viewport().height() + self.horizontalHeader().height())
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.model = QStandardItemModel(20, 7)
            header = ['Столбец 1', 'Столбец 2', 'Столбец 3', 'Столбец 4', 'Столбец 5', 'Столбец 6', 'Столбец 7',]
            self.model.setHorizontalHeaderLabels(header)
            
            self.tableView = FreezeTableWidget(self.model)
            self.setCentralWidget(self.tableView)
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.setWindowTitle("Пример замороженного столбца")
        window.resize(343, 310)
        window.show()
        sys.exit(app.exec())
    

    在此处输入图像描述

    在此处输入图像描述

    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5