PyQt5:第九天
设置不同风格的日期和时间
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class DateTimeEdit1(QWidget):
def __init__(self):
super(DateTimeEdit1, self).__init__()
self.setWindowTitle('设置不同风格的日期和事件')
self.resize(300, 90)
self.initUI()
def initUI(self):
layout = QVBoxLayout()
dataTimeEdit1 = QDateTimeEdit()
dataTimeEdit2 = QDateTimeEdit(QDateTime.currentDateTime())
dataEdit1 = QDateTimeEdit(QDate.currentDate())
timeEdit1 = QDateTimeEdit(QTime.currentTime())
dataTimeEdit1.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
dataTimeEdit2.setDisplayFormat("yyyy/MM/dd HH-mm-ss")
dataEdit1.setDisplayFormat("yyyy,MM,dd")
timeEdit1.setDisplayFormat("HH:mm:ss")
layout.addWidget(dataTimeEdit1)
layout.addWidget(dataTimeEdit2)
layout.addWidget(dataEdit1)
layout.addWidget(timeEdit1)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DateTimeEdit1()
main.show()
sys.exit(app.exec_())
日期和时间控件的高级操作
创建和使用菜单
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Menu(QMainWindow):
def __init__(self):
super(Menu,self).__init__()
self.setWindowTitle('创建和使用菜单')
self.resize(400, 350)
bar = self.menuBar() # 获取菜单栏
file = bar.addMenu("文件")
file.addAction("新建")
save = QAction("保存",self)
file.addAction(save)
save.setShortcut("Ctrl + S")
save.triggered.connect(self.process)
quit = QAction("退出",self)
file.addAction(quit)
edit = bar.addMenu("Edit")
edit.addAction("copy")
edit.addAction("paste")
def process(self,a):
print(self.sender().text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Menu()
main.show()
sys.exit(app.exec_())
创建和使用工具栏
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Toolbar(QMainWindow):
def __init__(self):
super(Toolbar,self).__init__()
self.setWindowTitle('工具栏')
self.resize(400, 300)
self.initUI()
def initUI(self):
tb1 = self.addToolBar("File")
new = QAction(QIcon(''),"new",self)
tb1.addAction(new)
open = QAction(QIcon(''),"open",self)
tb1.addAction(open)
save = QAction(QIcon(''),"save",self)
tb1.addAction(save)
tb1.actionTriggered.connect(self.toolbtnpressed)
tb2 = self.addToolBar("File1")
new1 = QAction(QIcon(''),"新建",self)
tb2.addAction(new1)
tb2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
def toolbtnpressed(self,a):
print("按下的工具栏按钮是",a.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Toolbar()
main.show()
sys.exit(app.exec_())
创建和使用状态栏
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class StatusBar(QMainWindow):
def __init__(self):
super(StatusBar,self).__init__()
self.setWindowTitle('创建和使用状态栏')
self.resize(300, 200)
self.initUI()
def initUI(self):
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("show")
file.triggered.connect(self.processTrigger)
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)
def processTrigger(self,q):
if q.text() == "show":
self.statusBar.showMessage(q.text() + "菜单被点击了",5000)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = StatusBar()
main.show()
sys.exit(app.exec_())
使用打印机
显示打印对话框
显示二维表数据
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class TabelView(QWidget):
def __init__(self, arg=None):
super().__init__(arg)
self.setWindowTitle('QTableView表格视图控件演示')
self.resize(500,300)
self.model = QStandardItemModel(4,3)
self.model.setHorizontalHeaderLabels(['id','姓名','年龄'])
self.tableview = QTableView()
# 关联QTableView控件和Model
self.tableview.setModel(self.model)
# 添加数据
item11 = QStandardItem('10')
item12 = QStandardItem('雷神')
item13 = QStandardItem('2000')
self.model.setItem(0,0,item11)
self.model.setItem(0, 1, item12)
self.model.setItem(0, 2, item13)
layout = QVBoxLayout()
layout.addWidget(self.tableview)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = TabelView()
main.show()
sys.exit(app.exec_())
显示列表数据
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ListViewDemo(QWidget):
def __init__(self):
super(ListViewDemo, self).__init__()
self.setWindowTitle('QListView')
self.resize(300, 270)
listview = QListView()
listModel = QStringListModel()
self.list = ["列表项1","列表项2","列表项3"]
listModel.setStringList(self.list)
listview.setModel(listModel)
listview.clicked.connect(self.clicked)
layout = QVBoxLayout()
layout.addWidget(listview)
self.setLayout(layout)
def clicked(self,item):
QMessageBox.information(self,"QListView","您选择了" + self.list[item.row()])
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ListViewDemo()
main.show()
sys.exit(app.exec_())
扩展的列表控件
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ListWidgetDemo(QMainWindow):
def __init__(self):
super(ListWidgetDemo,self).__init__()
self.setWindowTitle('QListWidget')
self.resize(300, 270)
self.listwidget = QListWidget()
self.listwidget.addItem("item1")
self.listwidget.addItem("item2")
self.listwidget.addItem("item3")
self.listwidget.addItem("item4")
self.listwidget.addItem("item5")
self.setCentralWidget(self.listwidget)
self.listwidget.itemClicked.connect(self.clicked)
def clicked(self,Index):
QMessageBox.information(self,"QListWidget","您选择了:" + self.listwidget.item(self.listwidget.row(Index)).text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ListWidgetDemo()
main.show()
sys.exit(app.exec_())
扩展的表格控件
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class TableWidget(QWidget):
def __init__(self):
super(TableWidget,self).__init__()
self.setWindowTitle('TableWidget')
self.resize(400, 350)
tablewidget = QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['姓名','年龄','籍贯'])
nameItem = QTableWidgetItem("小明")
tablewidget.setItem(0,0,nameItem)
ageItem = QTableWidgetItem("24")
tablewidget.setItem(0, 1, ageItem)
jgItem = QTableWidgetItem("北京")
tablewidget.setItem(0, 2, jgItem)
layout = QHBoxLayout()
layout.addWidget(tablewidget)
self.setLayout(layout)
# 调整列和行
tablewidget.resizeColumnsToContents()
tablewidget.resizeRowsToContents()
# 表头
# tablewidget.horizontalHeader().setVisible(False)
# tablewidget.verticalHeader().setVisible(False)
# 隐藏表格线
tablewidget.setShowGrid(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = TableWidget()
main.show()
sys.exit(app.exec_())
在单元格中放置控件
# PlaceControlInCell
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class PlaceControlInCell(QWidget):
def __init__(self):
super(PlaceControlInCell,self).__init__()
self.setWindowTitle('PlaceControlInCell')
self.resize(500, 300)
tablewidget = QTableWidget()
tablewidget.setColumnCount(3)
tablewidget.setRowCount(4)
tablewidget.setHorizontalHeaderLabels(['姓名','性别','体重'])
textItem = QTableWidgetItem('小明')
tablewidget.setItem(0,0,textItem)
combox = QComboBox()
combox.addItem('男')
combox.addItem('女')
# QSS
combox.setStyleSheet('QComboBox(margin:3px);')
tablewidget.setCellWidget(0,1,combox)
modeifyButton = QPushButton('修改')
modeifyButton.setDown(True)
modeifyButton.setStyleSheet('QPushButton(margin:3px);')
tablewidget.setCellWidget(0, 2, modeifyButton)
layout = QVBoxLayout()
layout.addWidget(tablewidget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = PlaceControlInCell()
main.show()
sys.exit(app.exec_())
在表格中快速定位到特殊的行
设置单元格字体和颜色
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class CellFontAndColor(QWidget):
def __init__(self):
super(CellFontAndColor, self).__init__()
self.setWindowTitle('设置单元格字体和颜色')
self.resize(430, 230)
tablewidget = QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['姓名', '年龄', '籍贯'])
layout = QHBoxLayout()
layout.addWidget(tablewidget)
self.setLayout(layout)
newItem = QTableWidgetItem('雷神')
newItem.setFont(QFont('Times',14,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)))
tablewidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('160')
newItem.setFont(QFont('Times', 20, QFont.Black))
newItem.setForeground(QBrush(QColor(0, 0, 255)))
tablewidget.setItem(0, 2, newItem)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = CellFontAndColor()
main.show()
sys.exit(app.exec_())
按表格的某一列排序
设置单元格的文本对齐方式
合并单元格
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Span(QWidget):
def __init__(self):
super(Span,self).__init__()
self.setWindowTitle('合并单元格')
self.resize(430, 230)
tablewidget = QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['姓名', '年龄', '籍贯'])
layout = QHBoxLayout()
layout.addWidget(tablewidget)
self.setLayout(layout)
newItem = QTableWidgetItem('雷神')
tablewidget.setItem(0,0,newItem)
tablewidget.setSpan(0,0,3,1)
newItem = QTableWidgetItem('女')
tablewidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('160')
tablewidget.setItem(0, 2, newItem)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Span()
main.show()
sys.exit(app.exec_())
设置单元格的尺寸
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class CellSize(QWidget):
def __init__(self):
super(CellSize,self).__init__()
self.setWindowTitle('设置单元格尺寸')
self.resize(530, 300)
tablewidget = QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['姓名', '年龄', '籍贯'])
layout = QHBoxLayout()
layout.addWidget(tablewidget)
self.setLayout(layout)
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)))
tablewidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('160')
newItem.setFont(QFont('Times', 20, QFont.Black))
newItem.setForeground(QBrush(QColor(0, 0, 255)))
tablewidget.setItem(0, 2, newItem)
tablewidget.setRowHeight(0,80)
tablewidget.setColumnWidth(0,200)
tablewidget.setColumnWidth(2, 120)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = CellSize()
main.show()
sys.exit(app.exec_())
单元格中实现图文混排
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class CellImageText(QWidget):
def __init__(self):
super(CellImageText,self).__init__()
self.setWindowTitle('单元格实现图文混排')
self.resize(600, 300)
self.tablewidget = QTableWidget()
self.tablewidget.setRowCount(5)
self.tablewidget.setColumnCount(4)
self.tablewidget.setHorizontalHeaderLabels(['姓名', '年龄', '籍贯', '显示图片'])
layout = QHBoxLayout()
layout.addWidget(self.tablewidget)
self.setLayout(layout)
newItem = QTableWidgetItem('李宁')
self.tablewidget.setItem(0,0,newItem)
newItem = QTableWidgetItem('男')
self.tablewidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('160')
self.tablewidget.setItem(0, 2, newItem)
newItem = QTableWidgetItem(QIcon('D:/PycharmProjects/pro2/2.png'),'背包')
self.tablewidget.setItem(0, 3, newItem)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = CellImageText()
main.show()
sys.exit(app.exec_())
改变单元格中图片的尺寸
在表格中显示上下文菜单
树控件
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class BasicTreeWidget(QWidget):
def __init__(self):
super(BasicTreeWidget, self).__init__()
self.setWindowTitle('BasicTreeWidget')
self.tree = QTreeWidget()
# 为树控件指定列数
self.tree.setColumnCount(2)
# 指定列标签
self.tree.setHeaderLabels(['Key','Value'])
root = QTreeWidgetItem(self.tree)
root.setText(0,'根节点')
root.setIcon(0,QIcon(''))
self.tree.setColumnWidth(0,160)
# 添加子节点
child = QTreeWidgetItem(root)
child.setText(0,'子节点')
child.setText(1,'子节点的数据')
child.setIcon(0,QIcon(''))
child.setCheckState(0, Qt.Checked)
layout = QHBoxLayout()
layout.addWidget(self.tree)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = BasicTreeWidget()
main.show()
sys.exit(app.exec_())
为树节点添加响应事件
选项卡控件
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class TabWidget(QTabWidget):
def __init__(self):
super(TabWidget,self).__init__()
self.setWindowTitle('TabWidget')
self.resize(400,300)
# 创建用于显示控件的窗口
self.tab1 = QWidget()
self.tab2 = QWidget()
self.tab3 = QWidget()
self.addTab(self.tab1,'选项卡1')
self.addTab(self.tab2, '选项卡2')
self.addTab(self.tab3, '选项卡3')
self.tab1UI()
self.tab2UI()
def tab1UI(self):
layout = QFormLayout()
layout.addRow('姓名',QLineEdit())
layout.addRow('地址',QLineEdit())
self.setTabText(0,'联系方式')
self.tab1.setLayout(layout)
def tab2UI(self):
layout = QFormLayout()
sex = QHBoxLayout()
sex.addWidget(QRadioButton('男'))
sex.addWidget(QRadioButton('女'))
layout.addRow('性别',sex)
layout.addRow('生日',QLineEdit())
self.setTabText(1,'个人详细信息')
self.tab2.setLayout(layout)
def tab3UI(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
main = TabWidget()
main.show()
sys.exit(app.exec_())
堆栈窗口控件
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class StackedWidget(QWidget):
def __init__(self):
super(StackedWidget,self).__init__()
self.setWindowTitle('StackedWidget')
self.list = QListWidget()
self.list.insertItem(0,'联系方式')
self.list.insertItem(1,'个人信息')
self.list.insertItem(2,'教育程度')
self.list.currentRowChanged.connect(self.display)
self.stack1 = QWidget()
self.stack2 = QWidget()
self.stack3 = QWidget()
self.tab1UI()
self.tab2UI()
self.tab3UI()
self.stack = QStackedWidget()
self.stack.addWidget(self.stack1)
self.stack.addWidget(self.stack2)
self.stack.addWidget(self.stack3)
hbox = QHBoxLayout()
hbox.addWidget(self.list)
hbox.addWidget(self.stack)
self.setLayout(hbox)
def tab1UI(self):
layout = QFormLayout()
layout.addRow('姓名',QLineEdit())
layout.addRow('地址',QLineEdit())
self.stack1.setLayout(layout)
def tab2UI(self):
layout = QFormLayout()
sex = QHBoxLayout()
sex.addWidget(QRadioButton('男'))
sex.addWidget(QRadioButton('女'))
layout.addRow('性别',sex)
layout.addRow('生日',QLineEdit())
self.stack2.setLayout(layout)
def tab3UI(self):
layout = QHBoxLayout()
layout.addWidget(QLabel('科目'))
layout.addWidget(QCheckBox('物理'))
layout.addWidget(QCheckBox('高数'))
self.stack3.setLayout(layout)
def display(self,index):
self.stack.setCurrentIndex(index)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = StackedWidget()
main.show()
sys.exit(app.exec_())
停靠控件
容纳多文档的窗口
滚动条控件
# ScrollBar
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ScrollBar(QWidget):
def __init__(self):
super(ScrollBar,self).__init__()
self.setWindowTitle('ScrollBar')
self.label = QLabel('拖动滚动条来改变状态')
self.scrollbar1 = QScrollBar()
self.scrollbar1.setMaximum(255)
self.scrollbar1.sliderMoved.connect(self.sliderMoved)
self.scrollbar2 = QScrollBar()
self.scrollbar2.setMaximum(255)
self.scrollbar2.sliderMoved.connect(self.sliderMoved)
self.scrollbar3 = QScrollBar()
self.scrollbar3.setMaximum(255)
self.scrollbar3.sliderMoved.connect(self.sliderMoved)
self.scrollbar4 = QScrollBar()
self.scrollbar4.setMaximum(255)
self.scrollbar4.sliderMoved.connect(self.sliderMoved1)
hbox = QHBoxLayout()
hbox.addWidget(self.label)
hbox.addWidget(self.scrollbar1)
hbox.addWidget(self.scrollbar2)
hbox.addWidget(self.scrollbar3)
hbox.addWidget(self.scrollbar4)
self.setGeometry(300,300,300,200)
self.y = self.label.pos().y()
self.setLayout(hbox)
def sliderMoved(self):
palette = QPalette()
color = QColor(self.scrollbar1.value(),self.scrollbar2.value(),self.scrollbar3.value(),255)
palette.setColor(QPalette.Foreground, color)
self.label.setPalette(palette)
def sliderMoved1(self):
self.label.move(self.label.x(), self.y+self.scrollbar4.value())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ScrollBar()
main.show()
sys.exit(app.exec_())