Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使QtableWidget单元格平方为我想要的大小?_Python_Pyqt5_Qtablewidget - Fatal编程技术网

Python 如何使QtableWidget单元格平方为我想要的大小?

Python 如何使QtableWidget单元格平方为我想要的大小?,python,pyqt5,qtablewidget,Python,Pyqt5,Qtablewidget,我正在尝试对QtableWidget进行放大/缩小。 要做到这一点,我必须考虑变量 self.myfont是Qfont对象,self.table_size是int 当我想要放大/缩小时,我调用这两个函数: def zoomin(self): fontsize = self.myfont.pointSize() + 1 if fontsize < 1: fontsize = 1 self.myfont.setPoi

我正在尝试对QtableWidget进行放大/缩小。 要做到这一点,我必须考虑变量 self.myfont是Qfont对象,self.table_size是int

当我想要放大/缩小时,我调用这两个函数:

   def zoomin(self):
        fontsize = self.myfont.pointSize() + 1
        if fontsize < 1:
            fontsize = 1
        self.myfont.setPointSize(fontsize)
        self.table_size += 5
        if self.table_size < 1:
            self.table_size = 1
        print(self.table_size,fontsize)
        self.redrawCMLayout()

    def zoomout(self):
        fontsize = self.myfont.pointSize() - 1
        if fontsize < 1:
            fontsize = 1
        self.myfont.setPointSize(fontsize)
        self.table_size -= 5
        if self.table_size < 1:
            self.table_size = 1
        print(self.table_size,fontsize)
        self.redrawCMLayout()
当我放大时,效果很好

但当我缩小时,水平标题宽度与垂直高度不再匹配

我怎样才能强迫他们将单元格按正方形排列,即使宽度和高度都很小

这是一个MRE

import sys
import os
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class ExampleWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(440, 240))
        self.setWindowTitle("PyQt5 Textarea example")

        self.myarray =  [[4, 0, 2, 1],
                         [6, 0, 3, 7],
                         [4, 2, 2, 8],
                         [3, 2, 1, 0]]
        self.myfont = QFont()
        self.myfont.setPointSize(10)
        self.table_size = 35

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.gridCM = QHBoxLayout()
        self.update_CMLayout()

        zoomin = QAction('zoomin', self)
        zoomin.setShortcut('Ctrl+shift+Z')
        zoomin.setToolTip('Redo')
        zoomin.triggered.connect(self.zoomin)

        zoomout = QAction( 'zoomout',self)
        zoomout.setShortcut('Ctrl+shift+Z')
        zoomout.setToolTip('Redo')
        zoomout.triggered.connect(self.zoomout)
        # toolbar
        toolbar = self.addToolBar('')
        toolbar.addAction(zoomin)
        toolbar.addAction(zoomout)


        self.centralWidget.setLayout(self.gridCM)


    def update_CMLayout(self):
        print('update_CMLayout')
        #self.gridCM = QHBoxLayout()
        self.grid3_layout = QGroupBox('Connectivity Matrix')
        grid3 = QGridLayout()
        self.grid3_layout.setLayout(grid3)

        self.tableWidget = QTableWidget()

        self.tableWidget.horizontalHeader().setFont(self.myfont)
        self.tableWidget.verticalHeader().setFont(self.myfont)

        self.tableWidget.verticalHeader().setDefaultSectionSize(self.table_size)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(self.table_size)

        self.tableWidget.horizontalHeader().setFixedHeight(self.table_size)
        self.tableWidget.verticalHeader().setFixedWidth(self.table_size)

        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)

        line = len(self.myarray)
        column = len(self.myarray[0])
        self.tableWidget.setRowCount(line)
        self.tableWidget.setColumnCount(column)

        for c in range(column):
            for l in range(line):
                item = QTableWidgetItem(str(self.myarray[c][l]))
                item.setFont(self.myfont)
                item.setSizeHint(QSize(self.table_size, self.table_size))
                self.tableWidget.setItem(c, l, item) 

        grid3.addWidget(self.tableWidget, 1, 1, 1, 1)

        self.gridCM.insertWidget(0, self.grid3_layout)


    def zoomin(self):
        fontsize = self.myfont.pointSize() + 1
        if fontsize < 1:
            fontsize = 1
        self.myfont.setPointSize(fontsize)
        self.table_size += 5
        if self.table_size < 1:
            self.table_size = 1
        print(self.table_size,fontsize)
        self.redrawCMLayout()

    def zoomout(self):
        fontsize = self.myfont.pointSize() - 1
        if fontsize < 1:
            fontsize = 1
        self.myfont.setPointSize(fontsize)
        self.table_size -= 5
        if self.table_size < 1:
            self.table_size = 1
        print(self.table_size,fontsize)
        self.redrawCMLayout()

    def redrawCMLayout(self):
        self.gridCM.removeWidget(self.grid3_layout)
        self.grid3_layout.deleteLater()
        self.grid3_layout = None
        self.tableWidget.deleteLater()
        self.tableWidget = None
        self.update_CMLayout()
        # self.layout_Main.insertItem(2,self.gridCM)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle("Windows")
    mainWin = ExampleWindow()
    mainWin.show()
    sys.exit( app.exec_() )
导入系统 导入操作系统 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 类示例窗口(QMainWindow): 定义初始化(自): QMainWindow.\uuuuu初始化\uuuuuu(自) 自设置最小大小(QSize(440240)) self.setWindowTitle(“PyQt5文本区域示例”) self.myarray=[[4,0,2,1], [6, 0, 3, 7], [4, 2, 2, 8], [3, 2, 1, 0]] self.myfont=QFont() self.myfont.setPointSize(10) self.table_size=35 self.centralWidget=QWidget() self.setCentralWidget(self.centralWidget) self.gridCM=QHBoxLayout() self.update\CMLayout() zoomin=QAction('zoomin',self) zoomin.setShortcut('Ctrl+shift+Z') zoomin.setToolTip('Redo') zoomin.triggered.connect(self.zoomin) zoomout=QAction('zoomout',self) zoomout.setShortcut('Ctrl+shift+Z') zoomout.setToolTip('Redo') zoomout.triggered.connect(self.zoomout) #工具栏 toolbar=self.addToolBar(“”) 工具栏.添加操作(缩放) 工具栏.添加操作(zoomout) self.centralWidget.setLayout(self.gridCM) def更新\ CMU布局(自身): 打印('update\CMLayout') #self.gridCM=QHBoxLayout() self.grid3_layout=QGroupBox('连接矩阵') grid3=QGridLayout() self.grid3_layout.setLayout(grid3) self.tableWidget=QTableWidget() self.tableWidget.horizontalHeader().setFont(self.myfont) self.tableWidget.verticalHeader().setFont(self.myfont) self.tableWidget.verticalHeader().setDefaultSectionSize(self.table_size) self.tableWidget.horizontalHeader().setDefaultSectionSize(self.table_size) self.tableWidget.horizontalHeader().setFixedHeight(self.table_size) self.tableWidget.verticalHeader().setFixedWidth(self.table_大小) self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed) self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed) line=len(self.myarray) column=len(self.myarray[0]) self.tableWidget.setRowCount(行) self.tableWidget.setColumnCount(列) 对于范围内的c(列): 对于范围内的l(行): item=QTableWidgetItem(str(self.myarray[c][l])) item.setFont(self.myfont) item.setSizeHint(QSize(自表大小、自表大小)) self.tableWidget.setItem(c、l、item) addWidget(self.tableWidget,1,1,1) self.gridCM.insertWidget(0,self.grid3\u布局) def缩放(自身): fontsize=self.myfont.pointSize()+1 如果字体大小小于1: fontsize=1 self.myfont.setPointSize(fontsize) self.table_size+=5 如果self.table_大小<1: self.table_size=1 打印(自身表格大小,字体大小) self.redrawCMLayout() def zoomout(自身): fontsize=self.myfont.pointSize()-1 如果字体大小小于1: fontsize=1 self.myfont.setPointSize(fontsize) 自身表格大小-=5 如果self.table_大小<1: self.table_size=1 打印(自身表格大小,字体大小) self.redrawCMLayout() def重绘CMLAYOUT(自): self.gridCM.removeWidget(self.grid3_布局) self.grid3_layout.deleteLater() self.grid3_布局=无 self.tableWidget.deleteLater() self.tableWidget=None self.update\CMLayout() #self.layout\u Main.insertItem(2,self.gridCM) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) 应用程序设置样式(“Windows”) mainWin=ExampleWindow() mainWin.show() sys.exit(app.exec_())
必须将setMinimumSectionSize设置为0。另一方面,与其删除和创建元素,不如重新使用:

class Delegate(QStyledItemDelegate):
    def sizeHint(self, option, index):
        s = QStyledItemDelegate.sizeHint(self, option, index)
        return max(s.width(), s.height()) * QSize(1, 1)


class ExampleWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.myfont = QFont()
        self.myfont.setPointSize(10)

        self.setMinimumSize(QSize(440, 240))
        self.setWindowTitle("PyQt5 Textarea example")

        self.myarray = [[4, 0, 2, 1], [6, 0, 3, 7], [4, 2, 2, 8], [3, 2, 1, 0]]

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.gridCM = QHBoxLayout(self.centralWidget)

        zoomin = QAction("zoomin", self)
        zoomin.setShortcut("Ctrl+shift+Z")
        zoomin.setToolTip("Redo")
        zoomin.triggered.connect(self.zoomin)

        zoomout = QAction("zoomout", self)
        zoomout.setShortcut("Ctrl+shift+Z")
        zoomout.setToolTip("Redo")
        zoomout.triggered.connect(self.zoomout)
        # toolbar
        toolbar = self.addToolBar("")
        toolbar.addAction(zoomin)
        toolbar.addAction(zoomout)

        self.grid3_layout = QGroupBox("Connectivity Matrix")
        grid3 = QGridLayout()
        self.grid3_layout.setLayout(grid3)
        self.gridCM.insertWidget(0, self.grid3_layout)
        self.tableWidget = QTableWidget()
        grid3.addWidget(self.tableWidget, 1, 1, 1, 1)

        line = len(self.myarray)
        column = len(self.myarray[0])
        self.tableWidget.setRowCount(line)
        self.tableWidget.setColumnCount(column)

        self.delegate = Delegate()
        self.tableWidget.setItemDelegate(self.delegate)

        for c, row in enumerate(self.myarray):
            for r, e in enumerate(row):
                item = QTableWidgetItem(str(e))
                self.tableWidget.setItem(r, c, item)

        for header in (
            self.tableWidget.horizontalHeader(),
            self.tableWidget.verticalHeader(),
        ):
            header.setSectionResizeMode(QHeaderView.ResizeToContents)
            header.setMinimumSectionSize(0)

        self.update_font()

    def zoomin(self):
        self.myfont.setPointSize(self.myfont.pointSize() + 1)
        self.update_font()

    def zoomout(self):
        if self.myfont.pointSize() > 1:
            self.myfont.setPointSize(self.myfont.pointSize() - 1)
            self.update_font()

    def update_font(self):
        self.tableWidget.setFont(self.myfont)

我在末尾添加了一个MRE。请注意,在放大和缩小操作中使用相同的快捷方式。更新很好,但我仍然得到未平方的单元格,例如,如果
self.myarray
中的值具有浮点值,例如4.123
class Delegate(QStyledItemDelegate):
    def sizeHint(self, option, index):
        s = QStyledItemDelegate.sizeHint(self, option, index)
        return max(s.width(), s.height()) * QSize(1, 1)


class ExampleWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.myfont = QFont()
        self.myfont.setPointSize(10)

        self.setMinimumSize(QSize(440, 240))
        self.setWindowTitle("PyQt5 Textarea example")

        self.myarray = [[4, 0, 2, 1], [6, 0, 3, 7], [4, 2, 2, 8], [3, 2, 1, 0]]

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.gridCM = QHBoxLayout(self.centralWidget)

        zoomin = QAction("zoomin", self)
        zoomin.setShortcut("Ctrl+shift+Z")
        zoomin.setToolTip("Redo")
        zoomin.triggered.connect(self.zoomin)

        zoomout = QAction("zoomout", self)
        zoomout.setShortcut("Ctrl+shift+Z")
        zoomout.setToolTip("Redo")
        zoomout.triggered.connect(self.zoomout)
        # toolbar
        toolbar = self.addToolBar("")
        toolbar.addAction(zoomin)
        toolbar.addAction(zoomout)

        self.grid3_layout = QGroupBox("Connectivity Matrix")
        grid3 = QGridLayout()
        self.grid3_layout.setLayout(grid3)
        self.gridCM.insertWidget(0, self.grid3_layout)
        self.tableWidget = QTableWidget()
        grid3.addWidget(self.tableWidget, 1, 1, 1, 1)

        line = len(self.myarray)
        column = len(self.myarray[0])
        self.tableWidget.setRowCount(line)
        self.tableWidget.setColumnCount(column)

        self.delegate = Delegate()
        self.tableWidget.setItemDelegate(self.delegate)

        for c, row in enumerate(self.myarray):
            for r, e in enumerate(row):
                item = QTableWidgetItem(str(e))
                self.tableWidget.setItem(r, c, item)

        for header in (
            self.tableWidget.horizontalHeader(),
            self.tableWidget.verticalHeader(),
        ):
            header.setSectionResizeMode(QHeaderView.ResizeToContents)
            header.setMinimumSectionSize(0)

        self.update_font()

    def zoomin(self):
        self.myfont.setPointSize(self.myfont.pointSize() + 1)
        self.update_font()

    def zoomout(self):
        if self.myfont.pointSize() > 1:
            self.myfont.setPointSize(self.myfont.pointSize() - 1)
            self.update_font()

    def update_font(self):
        self.tableWidget.setFont(self.myfont)