子类python pyqt5 QHeaderView

问题描述 投票:0回答:1

文件:table.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.tableWidget = QtWidgets.QTableWidget(Dialog)
        self.tableWidget.setColumnCount(6)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        item.setText("1")
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("2")
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("3")
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("4")
        self.tableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("5")
        self.tableWidget.setHorizontalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("6")
        self.tableWidget.setHorizontalHeaderItem(5, item)
        self.verticalLayout.addWidget(self.tableWidget)

        QtCore.QMetaObject.connectSlotsByName(Dialog)

文件:run_me.py

from PyQt5 import QtWidgets,QtCore,QtGui
from table import Ui_Dialog
import sys

class Run_me:
    
    def __init__(self):
        self.app = QtWidgets.QApplication(sys.argv)
        self.Dialog = QtWidgets.QDialog()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self.Dialog)
        self.Dialog.show()
        
        self.columns_min_width = []
        self.ui.tableWidget.resizeColumnsToContents()
        self.find_table_column_min_width()

        horizontal_header = self.ui.tableWidget.horizontalHeader()
        self.ui.tableWidget.setHorizontalHeader(CustomHeader(self.ui.tableWidget,self.columns_min_width))
        self.ui.tableWidget.updateGeometries()
        for column_index in range(0,len(self.columns_min_width)):
            header_item_text = self.ui.tableWidget.horizontalHeaderItem(column_index).text()
            print(header_item_text)
        
        sys.exit(self.app.exec_())

    def find_table_column_min_width(self):
        total_columns = self.ui.tableWidget.columnCount()
        self.columns_min_width = []
        for column_index in range(0,total_columns):
            column_width = self.ui.tableWidget.columnWidth(column_index)
            print(column_width)
            self.columns_min_width.append(column_width)

class CustomHeader(QtWidgets.QHeaderView):
    def __init__(self,table,columns_min_width):
        self.columns_min_width = columns_min_width
        self.total_columns = len(self.columns_min_width)
        self.header_labels = []
        for column_index in range(0,self.total_columns):
            column_text = table.horizontalHeaderItem(column_index).text()
            self.header_labels.append(column_text)
        super().__init__(QtCore.Qt.Horizontal,table)
        self.table = self.parentWidget()
        for column_index in range(0,self.total_columns):
            header_item = self.parentWidget().horizontalHeaderItem(column_index)
            header_item.setText(self.header_labels[column_index])
        self.track_move = False
        self.updateGeometries()
        
    def mousePressEvent(self,event):
        self.track_move = True
        QtWidgets.QHeaderView.mousePressEvent(self, event)
        print("Pressed")
    
    def mouseMoveEvent(self,event):
        if self.track_move:
            print("Moved while pressed")
            for column_index in range(0,self.total_columns):
                column_width = self.parentWidget().columnWidth(column_index)
                if column_width < self.columns_min_width[column_index]:
                    event.ignore()
                    return None
            QtWidgets.QHeaderView.mouseMoveEvent(self, event)
        else:
            QtWidgets.QHeaderView.mouseMoveEvent(self, event)
        
    def mouseReleaseEvent(self,event):
        self.track_move = False
        QtWidgets.QHeaderView.mouseReleaseEvent(self, event)
        print("Released")

        
if __name__ == "__main__":
    program = Run_me()

在这个例子中,我试图对标题部分调整大小(列宽度)设置约束,但是正如您所看到的,运行时没有可见的标题run_me.py

我有什么遗漏的吗?

python pyqt5 qtablewidget qheaderview
1个回答
0
投票
class CustomHeader(QtWidgets.QHeaderView):
    def __init__(self,table,columns_min_width):
        self.columns_min_width = columns_min_width
        self.total_columns = len(self.columns_min_width)
        self.header_labels = []
        for column_index in range(0,self.total_columns):
            column_text = table.horizontalHeaderItem(column_index).text()
            self.header_labels.append(column_text)
        super().__init__(QtCore.Qt.Horizontal,table)
        self.table = self.parentWidget()
        for column_index in range(0,self.total_columns):
            header_item = self.parentWidget().horizontalHeaderItem(column_index)
            header_item.setText(self.header_labels[column_index])
        self.setVisible(True)
        self.track_move = False
        self.updateGeometries()

    ...
    ...
    ...

诀窍是

self.setVisible(True)
。我认为默认情况下这是 True,但事实并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.