鱼C论坛

 找回密码
 立即注册
查看: 3323|回复: 19

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

[复制链接]
发表于 2020-9-20 20:41:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

我的问题就像我再网上找的这个图片一样:
351(J`~[N[~IYPPQ3QJC0`7.png

我想改成如下图所示的效果,请问一下,应该怎么操作???
%Y2C$QX@R%WEUDSEH3`KQ.png


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


  1. import pandas as pd
  2. import numpy as np
  3. from PyQt5 import QtCore, QtGui, QtWidgets
  4. from PyQt5.QtWidgets import *
  5. from PyQt5.QtCore import *
  6. import sys

  7. class Ui_MainWindow(QMainWindow):

  8.     def __init__(self):
  9.         super(QtWidgets.QMainWindow, self).__init__()
  10.         self.setupUi(self)
  11.         self.retranslateUi(self)

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

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

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

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

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

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

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

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

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

  55.     def open_excel(self):
  56.         openfile_name = QFileDialog.getOpenFileName(self, '选择文件', '', 'Excel files(*.xlsx , *.xls)')
  57.         global path_openfile_name
  58.         path_openfile_name = openfile_name[0]

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

  61.         ###===========前面两个数字代表坐标,后面两个数字代表合并的行列数==========================================
  62.         self.tableWidget_1.setSpan(0, 0, 2, 1)
  63.         self.tableWidget_1.setSpan(0, 1, 2, 1)
  64.         self.tableWidget_1.setSpan(0, 2, 2, 1)
  65.         self.tableWidget_1.setSpan(0, 3, 2, 1)
  66.         self.tableWidget_1.setSpan(0, 4, 2, 1)
  67.         self.tableWidget_1.setSpan(0, 5, 2, 1)
  68.         self.tableWidget_1.setSpan(0, 6, 1, 3)
  69.         self.tableWidget_1.setSpan(0, 9, 1, 3)
  70.         ###===========前面两个数字代表坐标,后面两个数字代表合并的行列数==========================================

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  156. if __name__ == "__main__":
  157.     app = QtWidgets.QApplication(sys.argv)
  158.     my = Ui_MainWindow()
  159.     my.show()
  160.     sys.exit(app.exec_())
复制代码

机械特性数据测试.zip

7.14 KB, 下载次数: 3

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-20 20:46:16 | 显示全部楼层
发错地方了吧,这不是应该web前端的么?而且给的网址里不是也写了原因和解决方法了么。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是呀  我用的python做的,用的pyqt中的table widget,只是想达到上面的效果,因为我也出现了这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


那把代码、数据贴出来啊,也好尝试下,否则怎么知道怎么解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你看吧 ,我把代码还有数据放上面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 21:17:58 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-20 21:20 编辑
差不多先生air 发表于 2020-9-20 21:14
你看吧 ,我把代码还有数据放上面了


好像没装PyQt5。。。。。。
一直用的是pyside2
为啥都没人用pyside2呢。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 21:22:33 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-20 21:30 编辑
差不多先生air 发表于 2020-9-20 21:14
你看吧 ,我把代码还有数据放上面了


图形界面是这样的么?
拖到最后看到了错位,是不是上下两个框宽度不一样啊,只有最后才会错位
这个没有直接设计UI的图形界面设计exe么?为什么都喜欢用代码来设置组件大小什么的
屏幕截图 2020-09-20 212154.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是这个错位的问题,我找了半天没有解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你说的是qtdesigner这个exe吗,这个我也有,但是我对里面的调一下参数,不是很熟悉,就直接码代码了,界面就是这个界面,因为我也是单独拉出来调试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-20 21:34:34 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-20 21:35 编辑
差不多先生air 发表于 2020-9-20 21:31
就是这个错位的问题,我找了半天没有解决

  1. self.tableWidget_1.setGeometry(QtCore.QRect(10, 124, 749, 76))
复制代码
  1. self.tableWidget.setGeometry(QtCore.QRect(10, 200, 770, 250))
复制代码


这个很好解决啊,就是因为宽度不一样啊,你设计成一样的宽度,但是没考虑到有滚动条也占了体积,减掉就好了呗,不过这是治标不治本的方法
不过我打开了其他的文档,也没啥问题,你试试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个工具会简单很多,我之前做了个图形界面,就是pyside2,主逻辑写代码,界面直接用加载Ui,需要修改界面了,直接改就行了,不用改代码,代码毕竟还是要想象位置、大小什么的,有界面直接拖拽不是很简单么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那最开始整体就不对称了呀,那我就没有必要做这样了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 10:26:08 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-21 10:43 编辑
差不多先生air 发表于 2020-9-21 08:39
那最开始整体就不对称了呀,那我就没有必要做这样了。


这不是对的很齐的么?哪里不齐了?你试过了没?和我这边界面不一样么?
屏幕截图 2020-09-21 102533.png
屏幕截图 2020-09-21 102516.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-21 10:57:39 | 显示全部楼层
疾风怪盗 发表于 2020-9-21 10:26
这不是对的很齐的么?哪里不齐了?你试过了没?和我这边界面不一样么?

我说的是开始的时候呀,你没有导入数据的时候。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 11:00:01 | 显示全部楼层
差不多先生air 发表于 2020-9-21 10:57
我说的是开始的时候呀,你没有导入数据的时候。。。

最开始不齐,有什么关系么?做这个就是为了导入excel看数据,数据齐了不就好了么?
就因为组件大小不一样,就不做了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 11:06:15 | 显示全部楼层
本帖最后由 lirenbing01 于 2020-9-21 11:11 编辑

https://blog.csdn.net/u014430031/article/details/78108920 试试这个文章能否帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个肯定不行呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 11:26:48 | 显示全部楼层

好吧
刚才好像有个人,回复说可以一个框里设置表头,但是貌似被审核删了。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 12:08:34 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-21 12:12 编辑

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

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

  2.             self.tableWidget.setColumnCount(input_table_colunms)
  3.             self.tableWidget.setRowCount(input_table_rows)
  4.             self.tableWidget.setHorizontalHeaderLabels(input_table_header)
复制代码


你好像就是参照这个模版改的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个帖子我找到过,但是设置不了多级表头,只能设置一级表头,我之前的程序就是参照这个改的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 08:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表