PyQt5入门(十三)表格 & 单元格(下)

目录

一.设置单元格的文本对齐方式

二.合并单元格

三.设置单元格的尺寸

四.在单元格中实现图文混排的效果

五.改变单元格中图片的尺寸

六.在表格中显示上下文菜单


一.设置单元格的文本对齐方式

setTextAlignment
Qt. AlignRight 右对齐        Qt.AlignBottom底端显示

代码:

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


class CellTextAlignment(QWidget):
    def __init__(self):
        super(CellTextAlignment, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('设置单元格的文本对齐方式')
        self.resize(430, 230)

        layout = QHBoxLayout()
        #表格对象
        tableWidget=QTableWidget()
        #四行三列
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        #设置表格字段
        tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])

        newItem=QTableWidgetItem('小明')
        #下面说的对齐与显示都是指在单元格中
        # 右对齐 底端显示,即右下,Qt.AlignRight默认是右上
        newItem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
        tableWidget.setItem(0,0,newItem)
        #中心对齐,底部显示
        newItem = QTableWidgetItem('男')
        newItem.setTextAlignment(Qt.AlignCenter | Qt.AlignBottom)
        tableWidget.setItem(0, 1, newItem)
        newItem = QTableWidgetItem('190')
        newItem.setTextAlignment(Qt.AlignRight)
        tableWidget.setItem(0, 2, newItem)

        layout.addWidget(tableWidget)
        self.setLayout(layout)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=CellTextAlignment()
    main.show()
    sys.exit(app.exec_())

运行结果:

二.合并单元格

setSpan(row, col ,要合并的行数,要合并的列数)

代码:

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


class MergeCell(QWidget):
    def __init__(self):
        super(MergeCell, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('合并单元格')
        self.resize(430, 230)

        layout = QHBoxLayout()
        #表格对象
        tableWidget=QTableWidget()
        #四行三列
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        #设置表格字段
        tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])

        newItem=QTableWidgetItem('小明')
        tableWidget.setItem(0,0,newItem)
        #setSpan(row, col, 要合并的行数,要合并的列数)
        tableWidget.setSpan(0,0,3,1)

        newItem = QTableWidgetItem('男')
        tableWidget.setItem(0, 1, newItem)
        tableWidget.setSpan(0, 1, 2, 1)

        newItem = QTableWidgetItem('190')
        tableWidget.setItem(0, 2, newItem)

        newItem=QTableWidgetItem('test')
        tableWidget.setItem(2,1,newItem)
        tableWidget.setSpan(2,1,1,2)

        layout.addWidget(tableWidget)
        self.setLayout(layout)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=MergeCell()
    main.show()
    sys.exit(app.exec_())

运行结果:

三.设置单元格的尺寸

单元格大小可手动拖动改变大小,当字体设置很大时,运行之后显示的单元格大小可能不足够显示出文字,只会显示三个点省略,这时就要设置单元格尺寸了。

代码:

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


class MergeCell(QWidget):
    def __init__(self):
        super(MergeCell, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('合并单元格')
        self.resize(600, 400)

        layout = QHBoxLayout()
        #表格对象
        tableWidget=QTableWidget()
        #四行三列
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        #设置表格字段
        tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])

        newItem = QTableWidgetItem('小明')  # 单元格的数据项
        newItem.setFont(QFont('Times', 40, QFont.Black))  # 字体,字号,颜色
        newItem.setForeground(QBrush(QColor(255, 0, 0)))
        tableWidget.setItem(0, 0, newItem)

        newItem = QTableWidgetItem('女')
        newItem.setForeground(QBrush(QColor(255, 255, 0)))
        newItem.setBackground(QBrush(QColor(0, 0, 255)))  # rgb
        tableWidget.setItem(0, 1, newItem)

        newItem = QTableWidgetItem('100')
        newItem.setFont(QFont('Times', 60, QFont.Black))
        newItem.setForeground(QBrush(QColor(0, 0, 255)))
        tableWidget.setItem(0, 2, newItem)

        tableWidget.setRowHeight(0, 120)  # 设置第一行高度,三个数据项都在第一行上,第一行的单元格高度都变为120
        tableWidget.setColumnWidth(0, 150)  # 设置第一列宽度
        tableWidget.setRowHeight(2,200)#设置第三行高度,注意这是第三行,而不是第三个单元格的高度!!!!!
        tableWidget.setColumnWidth(2,180)# 设置第二列宽度

        layout.addWidget(tableWidget)
        self.setLayout(layout)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=MergeCell()
    main.show()
    sys.exit(app.exec_())

运行结果:

改变尺寸前     改变尺寸后

四.在单元格中实现图文混排的效果

代码:

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


class MergeCell(QWidget):
    def __init__(self):
        super(MergeCell, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('合并单元格')
        self.resize(600, 250)

        layout = QHBoxLayout()
        #表格对象
        tableWidget=QTableWidget()
        #四行四列
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(4)
        #设置表格字段
        tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])

        newItem=QTableWidgetItem('李宁')
        tableWidget.setItem(0,0,newItem)
        newItem = QTableWidgetItem('男')
        tableWidget.setItem(0, 1, newItem)
        newItem = QTableWidgetItem('160')
        tableWidget.setItem(0, 2, newItem)

        newItem=QTableWidgetItem(QIcon('../picture/LinuxLogo.jpg'),'背包')
        tableWidget.setItem(0,3,newItem)

        layout.addWidget(tableWidget)
        self.setLayout(layout)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=MergeCell()
    main.show()
    sys.exit(app.exec_())

运行结果:

五.改变单元格中图片的尺寸

setIconSize(QSize(width, height))

bug:

随便在网上下的图片,png图片只有一张可以显示,批量改为.jpg后,大部分可以显示,但是仍有一张不行。

在Windows下批量修改文件后缀点这里

代码:

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


class CellImageSize(QWidget):
    def __init__(self):
        super(CellImageSize, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('改变单元格中图片尺寸')
        self.resize(1000, 900)

        layout = QHBoxLayout()
        #表格对象
        tableWidget=QTableWidget()
        #设置单元格中图片大小
        tableWidget.setIconSize(QSize(300,200))
        #五行三列
        tableWidget.setRowCount(5)
        tableWidget.setColumnCount(3)
        #设置表格字段
        tableWidget.setHorizontalHeaderLabels(['image1','image2','image3'])
        #让列的宽度和图片的宽度相同
        for i in range(3):
            tableWidget.setColumnWidth(i,300)
        #让行的高度和图片的高度相同
        for i in range(5):
            tableWidget.setRowHeight(i,200)

        for k in range(15):
            i=k/3 #行
            j=k%3 #列
            item=QTableWidgetItem()
            item.setIcon(QIcon('../picture/bag/bag%d.jpg' % (k+1)))
            tableWidget.setItem(i,j,item)

        layout.addWidget(tableWidget)
        self.setLayout(layout)


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=CellImageSize()
    main.show()
    sys.exit(app.exec_())

运行结果:

六.在表格中显示上下文菜单

1.如何弹出菜单
2.如果在满足条件的情况下弹出菜单
QMenu. exec_()

代码:

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


class CellImageSize(QWidget):
    def __init__(self):
        super(CellImageSize, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('在表格中显示上下文菜单')
        self.resize(500, 200)

        layout = QHBoxLayout()
        #表格对象
        self.tableWidget=QTableWidget()
        #五行三列
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3)
        #设置表格字段
        self.tableWidget.setHorizontalHeaderLabels(['name','sex','weigh'])

        #添加数据
        newItem = QTableWidgetItem('小明')
        self.tableWidget.setItem(0, 0, newItem)
        newItem = QTableWidgetItem('男')
        self.tableWidget.setItem(0, 1, newItem)
        newItem = QTableWidgetItem('190')
        self.tableWidget.setItem(0, 2, newItem)

        newItem = QTableWidgetItem('小亮')
        self.tableWidget.setItem(1, 0, newItem)
        newItem = QTableWidgetItem('男')
        self.tableWidget.setItem(1, 1, newItem)
        newItem = QTableWidgetItem('100')
        self.tableWidget.setItem(1, 2, newItem)

        newItem = QTableWidgetItem('小红')
        self.tableWidget.setItem(2, 0, newItem)
        newItem = QTableWidgetItem('女')
        self.tableWidget.setItem(2, 1, newItem)
        newItem = QTableWidgetItem('90')
        self.tableWidget.setItem(2, 2, newItem)

        #设置允许弹出上下文你菜单
        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        #信号与槽
        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)

        layout.addWidget(self.tableWidget)
        self.setLayout(layout)

    def generateMenu(self,pos):
        print('pos=',pos)
        for i in self.tableWidget.selectionModel().selection().indexes():
            rowNum=i.row()
            print('选择了第%d行' % (rowNum+1))
        #如果选择的行索引小于2,弹出上下文菜单
        if rowNum<2:
            menu=QMenu()
            item1=menu.addAction('菜单项1')#一个动作
            #print(type(item1))
            item2 = menu.addAction('菜单项2')
            item3 = menu.addAction('菜单项3')
            #pos是相对于整个屏幕的坐标,所以要转换为窗口坐标
            screenPos=self.tableWidget.mapToGlobal(pos)
            print('screenPos=',screenPos)
            #被阻塞
            action=menu.exec_(screenPos)
            if action==item1:
                print('选择了第一个菜单项',self.tableWidget.item(rowNum,0).text(),
                      self.tableWidget.item(rowNum, 1).text(),
                      self.tableWidget.item(rowNum, 2).text())
            elif action==item2:
                print('选择了第二个菜单项',self.tableWidget.item(rowNum,0).text(),
                      self.tableWidget.item(rowNum, 1).text(),
                      self.tableWidget.item(rowNum, 2).text())
            elif action==item3:
                print('选择了第三个菜单项',self.tableWidget.item(rowNum,0).text(),
                      self.tableWidget.item(rowNum, 1).text(),
                      self.tableWidget.item(rowNum, 2).text())
            else:
                return


if __name__=='__main__':
    app=QApplication(sys.argv)
    main=CellImageSize()
    main.show()
    sys.exit(app.exec_())

运行结果:

右键单元格会出现上下文菜单      

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/113552913