书写思路
1、QT界面的窗口构建思路及常用组件
2、简易QTableView的使用(关于QTableView中的data函数定义以及role的含义)
1、QT界面的窗口构建思路及常用组件
整体思路
在QWidget 里面放一条 QVBoxLayout (你就想象成一个会帮你自动换行的容器)
QVBoxLayout 里面 先放上 QTextEdit (文本编辑组件)再放上一个 QSlider (滑动条)
最后添加一个触发器,用于改变 QTextEdit 的显示
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QSlider,
QVBoxLayout, QApplication, QTextEdit)
class Example(QWidget):
def __init__(self):
super().__init__()
self.num = 0
self.initUI()
def initUI(self):
self.editText = QTextEdit()
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(self.editText)
self.setLayout(vbox)
sld.valueChanged.connect(self.changeEditText)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('触发事件')
self.show()
def changeEditText(self):
self.num += 1
self.editText.append("current num is : "+str(self.num))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())import sys
显示如上,进度条的变动会触发上面editText的打印和输出窗口的打印
2、简易QTableView的使用
1、简述一下Model/View框架:
Model/View框架 也就是 模型/视图框架 ,说他们是个什么东西其实也不清楚,说说他们的好处就瞬间明白了!
MV框架如上图,很明显的数据和视图解耦了!这就有一个很棒得好处了,这一份data可以拿到等多个视图中使用,十分方便做数据处理!View也不需要关心我的data是怎么处理的,做一个接口,从Model里面拿就是了!
2、QTabelView的使用方式:
就如上图所示,将Data放在Model里面处理,然后通过setModel方法将Model传入QTableView中
3、继承关系图:
QStandardItemModel:可以作为QListView、QTableView、QTreeView的标准model。
QAbstractListModel:需要使用QListView显示数据,并配合自定义model时,我们从此类继承。
QAbstractTableModel:需要使用QTableView显示数据时,并配合自定义model时,我们从此类继承。
QAbstractItemModel:需要使用QTreeView显示数据时,并配合自定义model时,我们从此类继承。
第三点引自此
4、QTabaleView中关于 row 和 column的定义:
import sys
from PyQt5.QtCore import pyqtSignal, QObject, QAbstractTableModel, QModelIndex, Qt, QVariant
from PyQt5.QtGui import QFont, QBrush
from PyQt5.QtWidgets import QMainWindow, QApplication, QTableView
class MyModel(QAbstractTableModel):
def __init__(self,parent=None):
super(MyModel, self).__init__(parent=None)
pass
def rowCount(self,parent=QModelIndex()):
return 4
def columnCount(self,parent=QModelIndex()):
return 5
def data(self,index,role):
row = index.row()
col = index.column()
if role == Qt.DisplayRole:
return "(" + str(index.row() + 1) + "," + str(index.column() + 1) + ")"
elif role == Qt.FontRole:
if row ==0 and col == 0:
boldFont = QFont()
boldFont.setBold(True)
return boldFont
elif role == Qt.BackgroundRole:
if row ==1 and col == 1:
return QBrush(Qt.red)
elif role == Qt.TextAlignmentRole:
if row ==2 and col == 2:
return Qt.AlignRight+Qt.AlignVCenter
elif role == Qt.CheckStateRole:
if row ==3 and col == 3:
return Qt.Checked
return QVariant()
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.tableView = None
self.initUI()
def initUI(self):
self.tableView = QTableView()
self.myModel = MyModel()
self.tableView.setModel(self.myModel)
self.tableView.show()
self.tableView.setWindowTitle("SimpleTable")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
运行结果如下
1、简要介绍一个下几个重要需要重写的函数:
QAbstractTableModel 是继承QAbstractItemModel,因此大部分需要重写的函数定义都在这,就上面用到的几个函数说明一下
①int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Returns the number of rows under the given parent
②int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const
Returns the number of columns for the children of the given parent.
③QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Returns the data stored under the given role for the item referred to by the index.
2、data中关于role的定义:
Qt.DisplayRole: 展示的内容
Qt.BackgroundRole:背景颜色
Qt.TextAlignmentRole:对齐方式
Qt.CheckStateRole: 就是我们在Andorid Unity中常见的Toggle
对照着上图的展示就明白了
更多详细定义如下:
上述图片链接
QTableView的API
PS这一章关于QAbstractTableModel 的定义十分重要,接下去关于更常用的QTreeView的定义也是一样的,尤其是data