#显示对话框
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
class PrintDialogDemo(QWidget): #这里用QWidget,layout才有效,用QMainWindow无效
def __init__(self):
super(PrintDialogDemo,self).__init__()
self.setGeometry(200,200,550,400)
self.setWindowTitle('打印对话框')
self.printer = QPrinter() #首先,实例化一个打印对象
self.initUI()
def initUI(self):
layout = QVBoxLayout(self)
self.textEdit = QTextEdit(self)
self.openFileButton = QPushButton('打开文件',self)
self.openFileButton.clicked.connect(self.openFileButtonClick)
self.printSettingButton = QPushButton('打印设置',self)
self.printSettingButton.clicked.connect(self.printSettingButtonClick)
self.printFileButton = QPushButton('打印文档',self)
self.printFileButton.clicked.connect(self.pringFileButtonClick)
layout.addWidget(self.openFileButton)
layout.addWidget(self.printFileButton)
layout.addWidget(self.printSettingButton)
layout.addWidget(self.textEdit)
def openFileButtonClick(self): #这里的方法名千万不要和按钮重复
fileDialog = QFileDialog()
fname = fileDialog.getOpenFileName(self,'open file','./')
if fname[0]: #getOpenFileName 可以打开多个文件
with open(fname[0],'r',encoding='utf-8',errors='ignore')as f:
self.textEdit.setText(f.read())
def printSettingButtonClick(self):
pageSetupDialog = QPageSetupDialog(self.printer,self)
pageSetupDialog.exec()
def pringFileButtonClick(self): #打印文件按钮响应方法
pirntDialog = QPrintDialog(self.printer,self) #先实例化打印对话框QPrintDialog,传入QPrinter对象参数
if QDialog.Accepted == pirntDialog.exec():
self.textEdit.print(self.printer)#textEdit自带print打印方法,传入QPrinter对象作为参数
if __name__ == '__main__':
app = QApplication(sys.argv)
main = PrintDialogDemo()
main.show()
sys.exit(app.exec_())
#显示二维表数据 QTableView控件 :首先要有数据源 ,需要创建QTableView实例和数据源(Model)然后关联
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class QTableViewDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QTableView 演示')
self.model = QStandardItemModel(4,3)
self.model.setHorizontalHeaderLabels(['id','name','age'])
self.tableView = QTableView() #创建QTableView对象
self.tableView.setModel(self.model) #把Model添加到QTableView对象中
item1 = QStandardItem('101')
item2 = QStandardItem('tom')
item3 = QStandardItem('25')
self.model.setItem(0,0,item1)
self.model.setItem(0,1,item2)
self.model.setItem(0,2,item3)
layout = QVBoxLayout(self)
layout.addWidget(self.tableView)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableViewDemo()
main.show()
sys.exit(app.exec_())
#显示列数据 QListView
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class QListViewDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QListView 演示')
layout = QVBoxLayout(self)
listView = QListView()
listModel = QStringListModel()
listView.setModel(listModel)
self.stringList = ['tom','jerry','lucy']
listModel.setStringList(self.stringList)
listView.clicked.connect(self.clicked)
layout.addWidget(listView)
def clicked(self,item):
QMessageBox.information(self,'QListView','您选择了:'+self.stringList[item.row()])
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QListViewDemo()
main.show()
sys.exit(app.exec_())
#扩展的列表控件 QListWidget
from PyQt5.QtWidgets import *
import sys
class QListWidgetDemo(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('QListWidget 演示')
self.resize(400,300)
self.listWidget = QListWidget() #实例化
self.listWidget.addItem('tom') #添加行内容
self.listWidget.addItem('lucy')
self.listWidget.addItem('jerry')
self.setCentralWidget(self.listWidget)#设置列表控件为整个主窗口的中心位置
self.listWidget.itemClicked.connect(self.listWidgetClicked) #绑定槽
def listWidgetClicked(self,index):
QMessageBox.information(self,'QListWidget','你选择了:'+self.listWidget.item(self.listWidget.row(index)).text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QListWidgetDemo()
main.show()
sys.exit(app.exec_())
#扩展的表格控件 QTableWidget 与QTableView对应
from PyQt5.QtWidgets import *
import sys
class QTableWidgetDemo(QWidget): #这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400,300)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(4)
self.tableWidget.setColumnCount(3)
self.tableWidget.setHorizontalHeaderLabels(['姓名','性别','年龄'])
item1 = QTableWidgetItem('tom')
item2 = QTableWidgetItem('male')
item3 = QTableWidgetItem('25')
self.tableWidget.setItem(0,0,item1)
self.tableWidget.setItem(0,1,item2)
self.tableWidget.setItem(0,2,item3)
layout = QVBoxLayout(self)
layout.addWidget(self.tableWidget)
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#设置不可以编辑项
self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)#设置选中整行
self.tableWidget.resizeColumnsToContents()#设置列宽度按照内容长度适应
self.tableWidget.verticalHeader().setVisible(False)#取消列头的显示
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetDemo()
main.show()
sys.exit(app.exec_())
#单元格中放控件 QTableWidget setCellWidget
from PyQt5.QtWidgets import *
import sys
class QTableWidgetCellDemo(QWidget): #这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400,300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(4)
self.tableWidget.setColumnCount(3)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name','age','sex'])
item1 = QTableWidgetItem('tom')
self.tableWidget.setItem(0,0,item1)#直接添加文本
combox = QComboBox()#添加一个下拉框
combox.addItem('男')
combox.addItem('女')
#QSS 样式,类似于html 中CSS
combox.setStyleSheet('QComboBox{margin:3px}')
self.tableWidget.setCellWidget(0,1,combox)
button = QPushButton('修改')#添加一个按钮
button.setDown(True)
button.setStyleSheet('QPushButton{margin:3px}')
self.tableWidget.setCellWidget(0,2,button)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())
# 单元格快速定位到指定行 findItems
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetCellDemo(QWidget): # 这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400, 300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(40)
self.tableWidget.setColumnCount(3)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])
#循环添加内容
for i in range(40):
for j in range(3):
itemContent = f'({i},{j})'
self.tableWidget.setItem(i,j,QTableWidgetItem(itemContent))
#搜索
text = '(12,1)'
item = self.tableWidget.findItems(text,Qt.MatchExactly)#精确匹配 还可以MatchStartWith 模糊匹配以什么开头
if len(item)>0:
item1 = item[0]
item1.setBackground(QBrush(QColor(0,255,0)))#设置背景色
item1.setForeground(QBrush(QColor(255,0,0)))#设置前景色
row = item1.row()
#定位到指定行
self.tableWidget.verticalScrollBar().setSliderPosition(row)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())
# 单元格设置字体和颜色
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetCellDemo(QWidget): # 这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400, 300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(40)
self.tableWidget.setColumnCount(3)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])
item1 = QTableWidgetItem('tom')
item1.setFont(QFont('Times',14,QFont.Black))
item1.setForeground(QBrush(QColor(255,0,0)))
self.tableWidget.setItem(0,0,item1)
item2 = QTableWidgetItem('25')
item2.setBackground(QBrush(QColor(0,0,255)))
item2.setForeground(QBrush(QColor(255,255,0)))
self.tableWidget.setItem(0,1,item2)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())
# 单元格排序
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetCellDemo(QWidget): # 这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400, 300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(40)
self.tableWidget.setColumnCount(3)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])
item1 = QTableWidgetItem('tom')
item2 = QTableWidgetItem('25')
item3 = QTableWidgetItem('男')
self.tableWidget.setItem(0,0,item1)
self.tableWidget.setItem(0,1,item2)
self.tableWidget.setItem(0,2,item3)
item1 = QTableWidgetItem('jerry')
item2 = QTableWidgetItem('22')
item3 = QTableWidgetItem('男')
self.tableWidget.setItem(1, 0, item1)
self.tableWidget.setItem(1, 1, item2)
self.tableWidget.setItem(1, 2, item3)
item1 = QTableWidgetItem('lucy')
item2 = QTableWidgetItem('20')
item3 = QTableWidgetItem('女')
self.tableWidget.setItem(2, 0, item1)
self.tableWidget.setItem(2, 1, item2)
self.tableWidget.setItem(2, 2, item3)
button = QPushButton('按年龄排序')
button.clicked.connect(self.order)
self.orderType = Qt.DescendingOrder #定义一个顺序类型变量
layout.addWidget(button)
def order(self):
if self.orderType == Qt.DescendingOrder:#如果是降序,就改成升序,否则改成降序
self.orderType = Qt.AscendingOrder
else:
self.orderType = Qt.DescendingOrder
self.tableWidget.sortItems(1,self.orderType)#把变量用在控件的第2个列
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())
# 单元格设置文本对齐方式 setTextAlignment Qt.AlignRight Qt.AlignLeft
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetCellDemo(QWidget): # 这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400, 300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(3)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])
item1 = QTableWidgetItem('tom')
item1.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
item2 = QTableWidgetItem('25')
item2.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
item3 = QTableWidgetItem('男')
item3.setTextAlignment(Qt.AlignLeft | Qt.AlignTop)
self.tableWidget.setItem(0,0,item1)
self.tableWidget.setItem(0,1,item2)
self.tableWidget.setItem(0,2,item3)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())
# 单元格合并 setSpan(row,col,要合并的行数,要合并的列数),设置单元格尺寸,图文混排,改变图片尺寸
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetCellDemo(QWidget): # 这里又用QWidget了 下面用了layout布局
def __init__(self):
super().__init__()
self.setWindowTitle('QTableWidget 演示')
self.resize(400, 300)
layout = QVBoxLayout(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(4)
layout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex','image'])
item1 = QTableWidgetItem('tom')
item2 = QTableWidgetItem('25')
item3 = QTableWidgetItem('男')
self.tableWidget.setItem(0,0,item1)
self.tableWidget.setSpan(0,0,3,1) #合并
self.tableWidget.setSpan(0,1,1,2) #合并
self.tableWidget.setRowHeight(1,50) #第二行行高50
self.tableWidget.setColumnWidth(2,40)#第三列列宽40
self.tableWidget.setItem(0,1,item2)
self.tableWidget.setItem(0,2,item3)
item4 = QTableWidgetItem(QIcon('./favicon.ico'),'image')#第四列是一个图片
self.tableWidget.setItem(0,3,item4)
item1 = QTableWidgetItem('tom')
item2 = QTableWidgetItem('25')
item3 = QTableWidgetItem('男')
item4 = QTableWidgetItem()
self.tableWidget.setItem(1,0,item1)
self.tableWidget.setItem(1,1,item2)
self.tableWidget.setItem(1,2,item3)
self.tableWidget.setItem(1,3,item4)
item4 = QTableWidgetItem(QIcon('./favicon.ico'), 'image') # 第四列是一个图片
self.tableWidget.setItem(1, 3, item4)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QTableWidgetCellDemo()
main.show()
sys.exit(app.exec_())