差不多先生air 发表于 2020-9-20 20:41:17

关于qtable widget中滚动条的设置问题?

本帖最后由 差不多先生air 于 2020-9-20 21:14 编辑

我设置了两个table widget,一个做表头,一个做接收表格内容,然后出现了以下的问题:

滚动条不高的时候,上下的表格是可以对齐的,滚动条滑到最右边表格标题和内容单元格无法对齐的问题

我的问题就像我再网上找的这个图片一样:


我想改成如下图所示的效果,请问一下,应该怎么操作???



这是我在网上找的一个类似的帖子,但是不知道怎么修改。https://www.cnblogs.com/xrab/p/7479527.html


import pandas as pd
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class Ui_MainWindow(QMainWindow):

    def __init__(self):
      super(QtWidgets.QMainWindow, self).__init__()
      self.setupUi(self)
      self.retranslateUi(self)

    def setupUi(self, MainWindow):
      MainWindow.setObjectName("MainWindow")
      MainWindow.resize(795, 605)
      #MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())#禁止拉伸窗口大小
      self.centralWidget = QtWidgets.QWidget(MainWindow)
      self.centralWidget.setObjectName("centralWidget")
      self.retranslateUi(MainWindow)

      MainWindow.setCentralWidget(self.centralWidget)
      QtCore.QMetaObject.connectSlotsByName(MainWindow)

      self.pushButton_6 = QtWidgets.QPushButton(self.centralWidget)
      self.pushButton_6.setGeometry(QtCore.QRect(480, 487, 75, 23))
      self.pushButton_6.setObjectName("pushButton_6")
      self.pushButton_6.setText("列表打开")

      self.pushButton_6.clicked.connect(self.open_excel)

      self.tableWidget = QtWidgets.QTableWidget(self.centralWidget)
      self.tableWidget.setGeometry(QtCore.QRect(10, 200, 772, 250))
      self.tableWidget.setObjectName("tableWidget")
      self.tableWidget.setColumnCount(0)
      self.tableWidget.setRowCount(0)
      self.tableWidget.setFrameShape(QtWidgets.QFrame.NoFrame)   #设置没有边框
      self.tableWidget.setStyleSheet("selection-background-color:pink")
      self.tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked)
      self.tableWidget.raise_()

      self.tableWidget_1 = QtWidgets.QTableWidget(self.centralWidget)
      self.tableWidget_1.setGeometry(QtCore.QRect(10, 124, 772, 76))
      self.tableWidget_1.setObjectName("tableWidget_1")
      self.tableWidget_1.setColumnCount(0)
      self.tableWidget_1.setRowCount(0)
      self.tableWidget_1.setEditTriggers(QAbstractItemView.NoEditTriggers)
      self.tableWidget_1.setStyleSheet("selection-background-color:pink")
      self.tableWidget_1.setFrameShape(QtWidgets.QFrame.NoFrame)
      self.tableWidget_1.verticalHeader().setVisible(False)# 隐藏垂直表头
      self.tableWidget_1.horizontalHeader().setVisible(False)# 隐藏水平表头
      self.tableWidget_1.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)   #隐藏垂直滚动条
      self.tableWidget_1.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)#隐藏水平滚动条

      ###===========连接两个tablewidget的水平滚动条==========================================
      self.tableWidget.horizontalScrollBar().valueChanged.connect(self.setValue)

    def setValue(self):
      self.tableWidget_1.horizontalScrollBar().setValue(self.tableWidget.horizontalScrollBar().value())
      ###===========连接两个tablewidget的水平滚动条==========================================

    def retranslateUi(self, MainWindow):
      _translate = QtCore.QCoreApplication.translate
      MainWindow.setWindowTitle(_translate("MainWindow", "综合测试平台"))

    def open_excel(self):
      openfile_name = QFileDialog.getOpenFileName(self, '选择文件', '', 'Excel files(*.xlsx , *.xls)')
      global path_openfile_name
      path_openfile_name = openfile_name

      self.tableWidget_1.setColumnCount(12)
      self.tableWidget_1.setRowCount(2)

      ###===========前面两个数字代表坐标,后面两个数字代表合并的行列数==========================================
      self.tableWidget_1.setSpan(0, 0, 2, 1)
      self.tableWidget_1.setSpan(0, 1, 2, 1)
      self.tableWidget_1.setSpan(0, 2, 2, 1)
      self.tableWidget_1.setSpan(0, 3, 2, 1)
      self.tableWidget_1.setSpan(0, 4, 2, 1)
      self.tableWidget_1.setSpan(0, 5, 2, 1)
      self.tableWidget_1.setSpan(0, 6, 1, 3)
      self.tableWidget_1.setSpan(0, 9, 1, 3)
      ###===========前面两个数字代表坐标,后面两个数字代表合并的行列数==========================================

      newItem_1 = QTableWidgetItem("文件名")
      self.tableWidget_1.setItem(0, 0, newItem_1)
      newItem_1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_2 = QTableWidgetItem("开关型号")
      self.tableWidget_1.setItem(0, 1, newItem_2)
      newItem_2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_3 = QTableWidgetItem("开关编号")
      self.tableWidget_1.setItem(0, 2, newItem_3)
      newItem_3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_4 = QTableWidgetItem("实验日期")
      self.tableWidget_1.setItem(0, 3, newItem_4)
      newItem_4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_5 = QTableWidgetItem("操作类型")
      self.tableWidget_1.setItem(0, 4, newItem_5)
      newItem_5.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_6 = QTableWidgetItem("操作电压")
      self.tableWidget_1.setItem(0, 5, newItem_6)
      newItem_6.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_7 = QTableWidgetItem("合闸时间(ms)")
      self.tableWidget_1.setItem(0, 6, newItem_7)
      newItem_7.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_8 = QTableWidgetItem("分闸时间(ms)")
      self.tableWidget_1.setItem(0, 9, newItem_8)
      newItem_8.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_9 = QTableWidgetItem("A")
      self.tableWidget_1.setItem(1, 6, newItem_9)
      newItem_9.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_10 = QTableWidgetItem("B")
      self.tableWidget_1.setItem(1, 7, newItem_10)
      newItem_10.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_11 = QTableWidgetItem("C")
      self.tableWidget_1.setItem(1, 8, newItem_11)
      newItem_11.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_12 = QTableWidgetItem("A")
      self.tableWidget_1.setItem(1, 9, newItem_12)
      newItem_12.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_13 = QTableWidgetItem("B")
      self.tableWidget_1.setItem(1, 10, newItem_13)
      newItem_13.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

      newItem_14 = QTableWidgetItem("C")
      self.tableWidget_1.setItem(1, 11, newItem_14)
      newItem_14.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
      ###===========读取表格,转换表格,==========================================
      if len(path_openfile_name) > 0:
            input_table_0 = pd.read_excel(path_openfile_name)# 读取excel文件里面的内容
            input_table = input_table_0.fillna(value='')# 将pandas的显示值Nan转化为空
            # print(input_table)
            input_table_rows = input_table.shape# 获取excel表格的行数,shape表示维度信息查看
            input_table_colunms = input_table.shape# 获取excel表格的列数
            # print(input_table_rows)
            # print(input_table_colunms)

            #input_table_header = input_table.columns.tolist()# 获取excel数据的表头
            #input_table_header = input_table.columns.values.tolist()
            # print(input_table_header)

            ###===========读取表格,转换表格,============================================
            ###======================给tablewidget设置行列表头============================

            self.tableWidget.setColumnCount(input_table_colunms)# 设置tableWidget的列数
            self.tableWidget.setRowCount(input_table_rows)# 设置tableWidget的行数
            #self.tableWidget.setHorizontalHeaderLabels(input_table_header)# 设置tableWidget的表头,setHorizontalHeaderLabels()设置水平标签
            # self.tableWidget.setHorizontalHeaderLabels(['文件名','开关型号','开关编号','','',''])
            self.tableWidget.verticalHeader().setVisible(False)# 隐藏垂直表头
            self.tableWidget.horizontalHeader().setVisible(False)# 隐藏水平表头

            ###======================给tablewidget设置行列表头============================

            ###================遍历表格每个元素,同时添加到tablewidget中========================
            for i in range(1,input_table_rows):
                input_table_rows_values = input_table.iloc[]# 读取excel表格每行数据
                # print(input_table_rows_values)
                input_table_rows_values_array = np.array(input_table_rows_values)# 将每行的数据以一维数组(矩阵)的形式存在
                # print(input_table_rows_values_array)
                input_table_rows_values_list = input_table_rows_values_array.tolist()# 将excel表格每行的数据以列表形式储存
                # print(input_table_rows_values_list)
                for j in range(input_table_colunms):
                  input_table_items_list = input_table_rows_values_list# 将excel表格每行数据依次排序
                  # print(input_table_items_list)
                  # print(type(input_table_items_list))

                  ###==============将遍历的元素添加到tablewidget中并显示=======================

                  input_table_items = str(input_table_items_list)
                  # print(input_table_items)
                  newItem = QTableWidgetItem(input_table_items)
                  newItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)# 设置单元格内文本的对齐方式,居中显示在垂直或者水平向上
                  self.tableWidget.setItem(i, j, newItem)# 设置表格中的值
      ###================遍历表格每个元素,同时添加到tablewidget中========================
            self.tableWidget.setRowHidden(0, 1)   #隐藏tableWidget中指定的行,0代表行数,1代表布尔值
      else:
            self.centralWidget.show()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    my = Ui_MainWindow()
    my.show()
    sys.exit(app.exec_())

疾风怪盗 发表于 2020-9-20 20:46:16

发错地方了吧,这不是应该web前端的么?而且给的网址里不是也写了原因和解决方法了么。。。。。。。

差不多先生air 发表于 2020-9-20 21:01:18

疾风怪盗 发表于 2020-9-20 20:46
发错地方了吧,这不是应该web前端的么?而且给的网址里不是也写了原因和解决方法了么。。。。。。。

不是呀我用的python做的,用的pyqt中的table widget,只是想达到上面的效果,因为我也出现了这种情况

疾风怪盗 发表于 2020-9-20 21:07:18

差不多先生air 发表于 2020-9-20 21:01
不是呀我用的python做的,用的pyqt中的table widget,只是想达到上面的效果,因为我也出现了这种情况

那把代码、数据贴出来啊,也好尝试下,否则怎么知道怎么解决?

差不多先生air 发表于 2020-9-20 21:14:49

疾风怪盗 发表于 2020-9-20 21:07
那把代码、数据贴出来啊,也好尝试下,否则怎么知道怎么解决?

你看吧 ,我把代码还有数据放上面了

疾风怪盗 发表于 2020-9-20 21:17:58

本帖最后由 疾风怪盗 于 2020-9-20 21:20 编辑

差不多先生air 发表于 2020-9-20 21:14
你看吧 ,我把代码还有数据放上面了

{:10_312:}好像没装PyQt5。。。。。。
一直用的是pyside2
为啥都没人用pyside2呢。。。。。。

疾风怪盗 发表于 2020-9-20 21:22:33

本帖最后由 疾风怪盗 于 2020-9-20 21:30 编辑

差不多先生air 发表于 2020-9-20 21:14
你看吧 ,我把代码还有数据放上面了

图形界面是这样的么?
拖到最后看到了错位,是不是上下两个框宽度不一样啊,只有最后才会错位
这个没有直接设计UI的图形界面设计exe么?为什么都喜欢用代码来设置组件大小什么的

差不多先生air 发表于 2020-9-20 21:31:18

疾风怪盗 发表于 2020-9-20 21:22
图形界面是这样的么?
拖到最后看到了错位,是不是上下两个框宽度不一样啊,只有最后才会错位
这个没 ...

就是这个错位的问题,我找了半天没有解决

差不多先生air 发表于 2020-9-20 21:33:58

疾风怪盗 发表于 2020-9-20 21:22
图形界面是这样的么?
拖到最后看到了错位,是不是上下两个框宽度不一样啊,只有最后才会错位
这个没 ...

你说的是qtdesigner这个exe吗,这个我也有,但是我对里面的调一下参数,不是很熟悉,就直接码代码了,界面就是这个界面,因为我也是单独拉出来调试的

疾风怪盗 发表于 2020-9-20 21:34:34

本帖最后由 疾风怪盗 于 2020-9-20 21:35 编辑

差不多先生air 发表于 2020-9-20 21:31
就是这个错位的问题,我找了半天没有解决

self.tableWidget_1.setGeometry(QtCore.QRect(10, 124, 749, 76))
self.tableWidget.setGeometry(QtCore.QRect(10, 200, 770, 250))

这个很好解决啊,就是因为宽度不一样啊,你设计成一样的宽度,但是没考虑到有滚动条也占了体积,减掉就好了呗,不过这是治标不治本的方法
不过我打开了其他的文档,也没啥问题,你试试吧

疾风怪盗 发表于 2020-9-20 21:36:58

差不多先生air 发表于 2020-9-20 21:33
你说的是qtdesigner这个exe吗,这个我也有,但是我对里面的调一下参数,不是很熟悉,就直接码代码了,界 ...

这个工具会简单很多,我之前做了个图形界面,就是pyside2,主逻辑写代码,界面直接用加载Ui,需要修改界面了,直接改就行了,不用改代码,代码毕竟还是要想象位置、大小什么的,有界面直接拖拽不是很简单么

差不多先生air 发表于 2020-9-21 08:39:02

疾风怪盗 发表于 2020-9-20 21:34
这个很好解决啊,就是因为宽度不一样啊,你设计成一样的宽度,但是没考虑到有滚动条也占了体积, ...

那最开始整体就不对称了呀,那我就没有必要做这样了。

疾风怪盗 发表于 2020-9-21 10:26:08

本帖最后由 疾风怪盗 于 2020-9-21 10:43 编辑

差不多先生air 发表于 2020-9-21 08:39
那最开始整体就不对称了呀,那我就没有必要做这样了。

这不是对的很齐的么?哪里不齐了?你试过了没?和我这边界面不一样么?

差不多先生air 发表于 2020-9-21 10:57:39

疾风怪盗 发表于 2020-9-21 10:26
这不是对的很齐的么?哪里不齐了?你试过了没?和我这边界面不一样么?

我说的是开始的时候呀,你没有导入数据的时候。。。

疾风怪盗 发表于 2020-9-21 11:00:01

差不多先生air 发表于 2020-9-21 10:57
我说的是开始的时候呀,你没有导入数据的时候。。。

最开始不齐,有什么关系么?做这个就是为了导入excel看数据,数据齐了不就好了么?
就因为组件大小不一样,就不做了?{:10_284:}

lirenbing01 发表于 2020-9-21 11:06:15

本帖最后由 lirenbing01 于 2020-9-21 11:11 编辑

https://blog.csdn.net/u014430031/article/details/78108920 试试这个文章能否帮到你

差不多先生air 发表于 2020-9-21 11:17:52

疾风怪盗 发表于 2020-9-21 11:00
最开始不齐,有什么关系么?做这个就是为了导入excel看数据,数据齐了不就好了么?
就因为组件大小不一 ...

这个肯定不行呀。

疾风怪盗 发表于 2020-9-21 11:26:48

差不多先生air 发表于 2020-9-21 11:17
这个肯定不行呀。

好吧{:10_284:}
刚才好像有个人,回复说可以一个框里设置表头,但是貌似被审核删了。。。。。。

疾风怪盗 发表于 2020-9-21 12:08:34

本帖最后由 疾风怪盗 于 2020-9-21 12:12 编辑

https://www.jianshu.com/p/88f48e667c17
看下这个,这里有你要的完全显示的,而且是在一个框里,可以参考下

###======================给tablewidget设置行列表头============================

            self.tableWidget.setColumnCount(input_table_colunms)
            self.tableWidget.setRowCount(input_table_rows)
            self.tableWidget.setHorizontalHeaderLabels(input_table_header)

你好像就是参照这个模版改的?

差不多先生air 发表于 2020-9-21 15:33:24

疾风怪盗 发表于 2020-9-21 12:08
https://www.jianshu.com/p/88f48e667c17
看下这个,这里有你要的完全显示的,而且是在一个框里,可以参考 ...

这个帖子我找到过,但是设置不了多级表头,只能设置一级表头,我之前的程序就是参照这个改的。
页: [1]
查看完整版本: 关于qtable widget中滚动条的设置问题?