PyQt4学习(一) 控件tableWidget

今天用了一下pyqt4中的tableWidget控件,这个控件是用来显示表格的。这个控件的使用不像buttonedit控件使用那么简单,要麻烦一些。不过呢,借助designer这个工具,使用这个控件就没有什么问题了。

首先在designer中,点击tableWidget控件,并拖到画布中。

clip_image001

在画布中,可以看到一个白色的框,右边是这个控件的一些属性。

clip_image003

在属性中,找到属于tableWidget控件的专属属性。

clip_image005

 

对里面的几个属性说明一下:

属性

作用

rowCount

表格的行

columnCount

表格的列

horizontalHeaderDefaultSectionSize

表格的每一个格子的默认水平大小

verticalHeaderDefaultSectionSize

表格的每一个格子的默认垂直大小

其他参数,从名字也可以看的出来。

 

下面就是关键的了,怎么创建表格了。

修改属性行列的值,可以看到控件有表格了。

clip_image007

然后将文件保存,转成.py文件看一下。

clip_image008

可以发现,只要设置行列的值,就可以创建一个表格了。那如果要创建一个10*10的表格,代码中只要以下代码就可以了。

            self.tableWidget.setRowCount(10)

        self.tableWidget.setColumnCount(10)

在下一步,怎么往单元中写数据了。这个还是要回到designer。对控件双击,会弹出对话框。clip_image009

往单元中,写入数据。右边的属性,是单元格的属性。

clip_image011

然后再转成.py看一下。发现代码要多了下面两部分。

clip_image012

这部分,是给单元格添加属性的。

clip_image014

这部分,是往单元格中写入数据的。

 

所以,可以看出,需要对单元格操作,先要对单元格添加属性,然后再对单元格操作。假设,要往刚刚创建的5*3表格中,依次写入1-15。代码就是以下:

1

2

3

4

5

6

7

8

9

10

for i in range(5):

            for j in range(3):

                item = QtGui.QTableWidgetItem()

                self.tableWidget.setItem(i, j, item)

    count = 1;

    for i in range(5):

        for j in range(3):

            item = self.tableWidget.item(i, j)

            item.setText(_translate("Form", str(count), None))

            count+=1

    生成的界面就是如下所示:

clip_image015

写数据也搞定了。那如果要改变行头和列头显示的内容了。比如要将行头显示的内容为单价,数量,总金额。列头显示的数据依次为ABCDE

照样还是回到designer中。对控件双击。对列添加。

clip_image016

就会出现一个新建列

clip_image018

同样,在新建行。

clip_image020

这个时候,在designer中控件就变成以下了:

clip_image021

转成.py看一下。多了以下两部分:

clip_image023

clip_image024

和单元格操作差不多一样。先给行头添加属性,然后再对行头操作。所以,要实现上面更改的,代码就是以下:

首先给行列头添加属性

1

2

3

4

5

6

for i in range(5):

            item = QtGui.QTableWidgetItem()

            self.tableWidget.setVerticalHeaderItem(i, item)

        for i in range(3):

            item = QtGui.QTableWidgetItem()

            self.tableWidget.setHorizontalHeaderItem(i, item)

    再设置属性值

1

2

3

4

5

6

7

8

temp_list = ['A','B','C','D','E']

        for i in range(5):

            item = self.tableWidget.verticalHeaderItem(i)

            item.setText(_translate("Form", temp_list[i], None))

        temp_list = ['单价','数量','总金额']

        for i in range(3):

            item = self.tableWidget.horizontalHeaderItem(i)

            item.setText(_translate("Form", temp_list[i], None))

    界面就是如下所示:

clip_image025

 

最后一个,说一下,怎么添加信号与槽,假设当在界面中选择一个单元时,打印出该单元的内容。这个依然是回到designer中。

clip_image027

选择信号与槽,然后点击空间,按住鼠标左键不放往外拖。会出现如下对话框:

clip_image029

对话框左边的就是控件的各个信号。从名字可以看出,cellClicked(intint)就是当点击了表中的单元格后,触发的信号。有两个参数,一个是横坐标,一个是列坐标。

clip_image031

选择编辑,为该信号创建一个槽。

clip_image033

然后转成.py看一下。多了以下一行代码:

QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("cellClicked(int,int)")), Form.isclicked)

然后再自己编写isclicked()函数即可,不过该函数是有两个参数的,第一个是行坐标,第二个是列坐标。

所以,要编写的代码就是:

def isclicked(self,row,col):

        print(row+1,col+1)

运行效果:

clip_image035

当点击单元格后,会打印出该单元格的坐标。

 

以上,就是控件tableWidget控件的使用方法,其实就是利用designer,把界面设计出来,然后去看对应python代码。就知道怎么使用了。

整个代码就是如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui.ui'
#
# Created: Fri Aug 14 15:09:13 2015
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(807, 621)
		#添加控件
        self.tableWidget = QtGui.QTableWidget(Form)
        self.tableWidget.setGeometry(QtCore.QRect(380, 200, 361, 311))
        #设置表格为5*3
		self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)
        
        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
		#为列头每个单元添加属性
        for i in range(5):
            item = QtGui.QTableWidgetItem()
            self.tableWidget.setVerticalHeaderItem(i, item)
		#为行头每个单元添加属性
        for i in range(3):
            item = QtGui.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(i, item)
		#为每个单元格添加属性
        for i in range(5):
            for j in range(3):
                item = QtGui.QTableWidgetItem()
                self.tableWidget.setItem(i, j, item)
        self.retranslateUi(Form)
		#关联槽
        QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("cellClicked(int,int)")), Form.isclicked)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
		#设置列头的显示内容
        temp_list = ['A','B','C','D','E'] 
        for i in range(5):
            item = self.tableWidget.verticalHeaderItem(i)
            item.setText(_translate("Form", temp_list[i], None))
		#设置行头的显示内容
        temp_list = ['单价','数量','总金额']
        for i in range(3):
            item = self.tableWidget.horizontalHeaderItem(i)
            item.setText(_translate("Form", temp_list[i], None))
		#设置单元格显示数据
        count = 1;
        for i in range(5):
            for j in range(3):
                item = self.tableWidget.item(i, j)
                item.setText(_translate("Form", str(count), None))
                count+=1

        __sortingEnabled = self.tableWidget.isSortingEnabled()
        self.tableWidget.setSortingEnabled(False)
        
        self.tableWidget.setSortingEnabled(__sortingEnabled)

    def isclicked(self,row,col):
		#打印单击单元格的横纵坐标
        print(row+1,col+1)

  

其他的控件,都可以通过designer这个工作,来获取控件的一些操作方法。

此条目发表在python, 编程语言分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。