pyqt5开发学习笔记!可能会是篇很长的记录!学习的过程总是痛苦的.迈过去了.一切都开朗...
1.1.给窗口和控件添加提示信息
import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QToolTip, QWidget, QHBoxLayout
from PyQt5.QtGui import QFont
class ToolTipForm(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont("sansSerif", 12))
self.setToolTip("这是一个窗口提示文字")
self.setGeometry(300, 300, 400, 400)
self.setWindowTitle("这是窗口的标题")
self.button1 = QPushButton('我的按钮')
self.button1.setToolTip("这是按钮上的提示")
layout = QHBoxLayout()
layout.addWidget(self.button1)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = ToolTipForm()
main.show()
sys.exit(app.exec_())
1.2.Qlable使用
代码如下
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QToolTip, QWidget, QVBoxLayout
from PyQt5.QtGui import QPixmap, QFont, QPalette
from PyQt5.QtCore import Qt
class QlabelDemon(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
labe1 = QLabel(self)
labe2 = QLabel(self)
labe3 = QLabel(self)
labe4 = QLabel(self)
labe1.setText("<font color='yello'>这是一个文本标签</font>")
labe1.setAutoFillBackground(True)
palette = QPalette()
palette.setColor(QPalette.Window, Qt.blue)
labe1.setPalette(palette)
labe1.setAlignment(Qt.AlignCenter)
labe2.setText("<a href='#'>欢迎走入PYTHON GUI</a>")
labe2.setAlignment(Qt.AlignCenter)
labe3.setToolTip("这是个图片标签")
labe3.setPixmap(QPixmap('.\image\logo.png'))
labe4.setText("<a href='https://www.ttgame.net'>天心数据</a>")
labe4.setOpenExternalLinks(True)
labe4.setAlignment(Qt.AlignRight)
labe4.setToolTip("这是个超级链接")
labe2.linkHovered.connect(self.linkHover)
labe4.linkActivated.connect(self.linkClick)
qv = QVBoxLayout()
qv.addWidget(labe1)
qv.addWidget(labe2)
qv.addWidget(labe3)
qv.addWidget(labe4)
self.setLayout(qv)
self.setWindowTitle("测试lable和事件")
def linkHover(self):
print("当鼠标滑过lable2时触发的事件")
def linkClick(self):
print("当鼠标点击lable4时触发的事件")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QlabelDemon()
main.show()
sys.exit(app.exec_())
1.3.Qlabel设置伙伴关系和快捷键
import sys
from PyQt5.QtWidgets import *
class QlabelBuddy(QDialog):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("测试lable伙伴")
namelabel = QLabel('&Name', self)
nameLineEditor = QLineEdit(self)
namelabel.setBuddy(nameLineEditor)
pwdlabel = QLabel('&Password', self)
pwdLineEditor = QLineEdit(self)
pwdlabel.setBuddy(pwdLineEditor)
btnOK = QPushButton("&OK")
btnCancel = QPushButton("&Cancel")
mainLayout = QGridLayout(self)
mainLayout.addWidget(namelabel, 0, 0)
mainLayout.addWidget(nameLineEditor, 0, 1, 1, 2) #占用的行,列
mainLayout.addWidget(pwdlabel, 1, 0)
mainLayout.addWidget(pwdLineEditor, 1, 1, 1, 2)
mainLayout.addWidget(btnOK, 2, 0)
mainLayout.addWidget(btnCancel, 2, 1, 1, 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QlabelBuddy()
main.show()
sys.exit(app.exec_())
1.4.设置lineEdit输入框回显模式
4种回显示模式
import sys
from PyQt5.QtWidgets import *
class QLineEditEchoMode(QWidget):
def __init__(self):
super(QLineEditEchoMode, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('文本输入框回显模式')
fromLayout = QFormLayout()
normalLineEdit = QLineEdit()
noEchoLineEdit = QLineEdit()
passwordLineEdit = QLineEdit()
passwordEchoOnLineEdit = QLineEdit()
normalLineEdit.setPlaceholderText("normalLineEdit")
noEchoLineEdit.setPlaceholderText("noEchoLineEdit")
passwordLineEdit.setPlaceholderText("passwordLineEdit")
passwordEchoOnLineEdit.setPlaceholderText("passwordEchoOnLineEdit")
normalLineEdit.setEchoMode(QLineEdit.Normal)
noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
passwordLineEdit.setEchoMode(QLineEdit.Password)
passwordEchoOnLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)
fromLayout.addRow("Normal", normalLineEdit)
fromLayout.addRow("noEchoLineEdit", noEchoLineEdit)
fromLayout.addRow("passwordLineEdit", passwordLineEdit)
fromLayout.addRow("passwordEchoOnEdit", passwordEchoOnLineEdit)
self.setLayout(fromLayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QLineEditEchoMode()
main.show()
sys.exit(app.exec_())
1.4.LineEdit检验器
通过设置检验器,检测对应的输入
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
from PyQt5.QtCore import QRegExp
class QLineEditValidator(QWidget):
def __init__(self):
super(QLineEditValidator, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("校验器")
formLayout = QFormLayout()
intLineEdit = QLineEdit()
doubleLineEdit = QLineEdit()
validatorLineEdit = QLineEdit()
formLayout.addRow("整数类型", intLineEdit)
formLayout.addRow("浮点类型", doubleLineEdit)
formLayout.addRow("正则表达式", validatorLineEdit)
intLineEdit.setPlaceholderText("整数")
doubleLineEdit.setPlaceholderText("小数")
validatorLineEdit.setPlaceholderText("正则")
#整型校验器
intValidator = QIntValidator(self)
intValidator.setRange(1, 99)
#浮点校验器
doubleValidator = QDoubleValidator(self)
doubleValidator.setRange(-360, 360)
#标准显示浮点数
doubleValidator.setNotation(QDoubleValidator.StandardNotation)
doubleValidator.setDecimals(2)
#字母和数字
reg = QRegExp("[a-zA-Z0-9]+$")
validator = QRegExpValidator(self)
validator.setRegExp(reg)
#设置校验器
intLineEdit.setValidator(intValidator)
doubleLineEdit.setValidator(doubleValidator)
validatorLineEdit.setValidator(validator)
self.setLayout(formLayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
qLineEditValidator = QLineEditValidator()
qLineEditValidator.show()
sys.exit(app.exec_())
1.5.使用掩码限制QLineEdit的输入
import sys
from PyQt5.QtWidgets import *
class QLineEditMask(QWidget):
def __init__(self):
super(QLineEditMask,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("用掩码限制QLineEdit的输入")
formLayout = QFormLayout()
ipLineEdit = QLineEdit()
macLineEdit = QLineEdit()
dateLineEdit = QLineEdit()
licenseLineEdit = QLineEdit()
ipLineEdit.setInputMask("000.000.000.000;_")
macLineEdit.setInputMask("HH:HH:HH:HH:HH:HH;_")
dateLineEdit.setInputMask("0000-00-00")
licenseLineEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#")
formLayout.addRow("数字掩码", ipLineEdit)
formLayout.addRow("MAC掩码", macLineEdit)
formLayout.addRow("date掩码", dateLineEdit )
formLayout.addRow("许可证掩码", licenseLineEdit)
self.setLayout(formLayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QLineEditMask()
main.show()
sys.exit(app.exec_())
1.6.文本输入QLineEdit综合例子
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QLineEditDemo(QWidget):
def __init__(self):
super(QLineEditDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QLineEdit综合例子")
formLayout = QFormLayout()
self.setLayout(formLayout)
edit1 = QLineEdit()
edit1.setValidator(QIntValidator())
edit1.setMaxLength(4)
edit1.setFont(QFont('Arial', 20))
edit1.setAlignment(Qt.AlignRight) #文本在右侧
edit2 = QLineEdit()
edit2.setValidator(QDoubleValidator(0.01, 99.99, 2))
edit2.setMaxLength(5)
edit3 = QLineEdit()
edit3.setInputMask("99_9999_999999;#")
edit4 = QLineEdit()
edit4.textChanged.connect(self.textChanged)
edit5 = QLineEdit()
edit5.setEchoMode(QLineEdit.Password)
edit5.editingFinished.connect(self.pressEnter)
edit6 = QLineEdit('hello world')
edit6.setReadOnly(True)
formLayout.addRow("整数校验", edit1)
formLayout.addRow("浮点数校验", edit2)
formLayout.addRow("Input Mask", edit3)
formLayout.addRow("文本变化", edit4)
formLayout.addRow("密码变化", edit5)
formLayout.addRow("只读文本", edit6)
def textChanged(self, text):
print("输入的内容:" + text)
def pressEnter(self):
print("输入完成")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QLineEditDemo()
main.show()
sys.exit(app.exec_())
2.1.多行文本输入框的设置,获取
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class QTextEditDemo(QWidget):
def __init__(self):
super(QTextEditDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QEditText控制演示")
self.resize(300, 400)
self.textEdit = QTextEdit()
self.buttonText = QPushButton("显示文本")
self.buttonHtml = QPushButton("显示HTML")
self.buttonToText = QPushButton("获取文本")
self.buttonToHtml = QPushButton("获取HTML")
layout = QVBoxLayout()
layout.addWidget(self.textEdit)
layout.addWidget(self.buttonText)
layout.addWidget(self.buttonHtml)
layout.addWidget(self.buttonToText)
layout.addWidget(self.buttonToHtml)
self.setLayout(layout)
self.buttonText.clicked.connect(self.onClick_ButtonText)
self.buttonHtml.clicked.connect(self.onClick_ButtonHtml)
self.buttonToText.clicked.connect(self.onClick_ToButtonText)
self.buttonToHtml.clicked.connect(self.onClick_ToButtonHtml)
def onClick_ButtonText(self):
self.textEdit.setPlainText("HELLO WORLD 你好呀")
def onClick_ButtonHtml(self):
self.textEdit.setHtml("<FONT COLOR='green'>HELLO WORLD 帅呆了</FONT>")
def onClick_ToButtonText(self):
print(self.textEdit.toPlainText())
def onClick_ToButtonHtml(self):
print(self.textEdit.toHtml())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QTextEditDemo()
main.show()
sys.exit(app.exec_())
3.1.常见按钮和事件关联2种方式
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QPushButton Demo")
layout = QVBoxLayout()
self.button1 = QPushButton("第一个按钮")
self.button1.setText("first button")
self.button1.setCheckable(True)
self.button1.toggle()
self.button1.clicked.connect(lambda :self.whichButton(self.button1))
self.button1.clicked.connect(self.buttonState)
layout.addWidget(self.button1)
self.setLayout(layout)
self.resize(400, 300)
#文本前显示图片
self.button2 = QPushButton("图像按钮")
self.button2.setIcon(QIcon(QPixmap("./image/logo.ico")))
self.button2.clicked.connect(lambda :self.whichButton(self.button2))
layout.addWidget(self.button2)
#不可用按钮
self.button3 = QPushButton("不可用按钮")
self.button3.setEnabled(False)
layout.addWidget(self.button3)
#默认的按钮
self.button4 = QPushButton("&Mybutton默认按钮")
self.button4.setDefault(True)
self.button4.clicked.connect(lambda :self.whichButton(self.button4))
layout.addWidget(self.button4)
def whichButton(self, btn):
print("被单击的按钮是<" + btn.text() + ">" )
def buttonState(self):
if self.button1.isChecked():
print("按钮已被选中")
else:
print("按钮没被选中")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_())
4.1.单选按钮状态切换
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QRadioButtonDemo(QWidget):
def __init__(self):
super(QRadioButtonDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QRadioButton1")
layout = QHBoxLayout()
self.radionButton1 = QRadioButton("单选按钮1")
self.radionButton1.setChecked(True)
self.radionButton1.toggled.connect(self.buttonState)
layout.addWidget(self.radionButton1)
self.radionButton2 = QRadioButton("单选按钮2")
self.radionButton2.toggled.connect(self.buttonState)
layout.addWidget(self.radionButton2)
self.resize(400, 300)
self.setLayout(layout)
def buttonState(self):
radionButton = self.sender()
if radionButton.isChecked() == True:
print("<" + radionButton.text() + ">被选中")
else:
print("<" + radionButton.text() + ">未被选中")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QRadioButtonDemo()
main.show()
sys.exit(app.exec_())
5.1.复选框按钮状态切换和事件触发
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QCheckBoxDemo(QWidget):
def __init__(self):
super(QCheckBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QCheckBox演示")
layout = QHBoxLayout()
self.checkbox1 = QCheckBox('复选按钮1')
self.checkbox1.setChecked(True)
self.checkbox1.stateChanged.connect(lambda :self.checkBoxState(self.checkbox1))
layout.addWidget(self.checkbox1)
self.checkbox2 = QCheckBox('复选按钮2')
self.checkbox2.stateChanged.connect(lambda: self.checkBoxState(self.checkbox2))
layout.addWidget(self.checkbox2)
self.checkbox3 = QCheckBox('复选按钮3')
self.checkbox3.setTristate(True)
self.checkbox3.setCheckState(Qt.PartiallyChecked)
self.checkbox3.stateChanged.connect(lambda: self.checkBoxState(self.checkbox3))
layout.addWidget(self.checkbox3)
self.setLayout(layout)
def checkBoxState(self, cb):
checkstatus1 = self.checkbox1.text() + ', is checked = ' + str(self.checkbox1.isChecked()) + ', checkState = ' + str(self.checkbox1.checkState()) + "\n"
checkstatus2 = self.checkbox2.text() + ', is checked = ' + str(self.checkbox2.isChecked()) + ', checkState = ' + str(self.checkbox2.checkState()) + "\n"
checkstatus3 = self.checkbox3.text() + ', is checked = ' + str(self.checkbox3.isChecked()) + ', checkState = ' + str(self.checkbox3.checkState()) + "\n"
print(checkstatus1 + checkstatus2 + checkstatus3)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QCheckBoxDemo()
main.show()
sys.exit(app.exec_())
6.1.下拉列表控制文本设置,方法调用
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QComboBoxDemo(QComboBox):
def __init__(self):
super(QComboBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QComboBox Demo")
layout = QHBoxLayout()
self.resize(300, 200)
self.mylable = QLabel("请选择编程语言:")
self.cb = QComboBox()
self.cb.addItem("Java")
self.cb.addItem("PHP")
self.cb.addItems(["Pyton", "C#", "C++"])
self.cb.currentIndexChanged.connect(self.selectionChanged)
layout.addWidget(self.mylable)
layout.addWidget(self.cb)
self.setLayout(layout)
def selectionChanged(self, i):
self.mylable.setText(self.cb.currentText())
self.mylable.adjustSize()
for count in range(self.cb.count()):
print("item" + str(count) + "=" + self.cb.itemText(count))
print("courrent index:" , i, 'selection changed', self.cb.currentText())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QComboBoxDemo()
main.show()
sys.exit(app.exec_())
7.1.QSpinBox计数器
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QSpinBoxDemon(QWidget):
def __init__(self):
super(QSpinBoxDemon, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QSpinBox Demon")
self.resize(300, 400)
layout = QVBoxLayout()
self.lable = QLabel("当前值")
self.lable.setAlignment(Qt.AlignCenter)
layout.addWidget(self.lable)
self.sb = QSpinBox()
self.sb.setValue(18)
self.sb.setSingleStep(3)
self.sb.setRange(0, 40)
self.sb.valueChanged.connect(self.valueChange)
layout.addWidget(self.sb)
self.setLayout(layout)
def valueChange(self):
self.lable.setText("当前值:" + str(self.sb.text()))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QSpinBoxDemon()
main.show()
sys.exit(app.exec_())
8,1.滑块控件使用和设置
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QSliderDemo(QWidget):
def __init__(self):
super(QSliderDemo, self).__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.setWindowTitle("QSlider Demo")
self.resize(300, 400)
self.label = QLabel("Qlable")
layout.addWidget(self.label)
#水平间隔
self.qslider = QSlider(Qt.Horizontal)
self.qslider.setMinimum(1) #最小值
self.qslider.setMaximum(100) #最大值
self.qslider.setTickPosition(QSlider.TicksLeft)
self.qslider.setValue(50) #默认值
self.qslider.setSingleStep(5) #按键头键默认步长是5
self.qslider.setTickInterval(10) #刻度间隔是10,100/10,所以可以显示10个刻度
self.qslider.valueChanged.connect(self.valueChange)
layout.addWidget(self.qslider)
#垂直间隔
self.qslider1 = QSlider(Qt.Vertical)
self.qslider1.setMinimum(1) # 最小值
self.qslider1.setMaximum(10) # 最大值
self.qslider1.setTickPosition(QSlider.TicksBelow)
# self.qslider1.setValue(5) # 默认值
self.qslider1.setSingleStep(1) # 按键头键默认步长是1
self.qslider1.setTickInterval(2) # 刻度间隔是10,10/1,所以可以显示10个刻度
self.qslider1.valueChanged.connect(self.valueChange)
layout.addWidget(self.qslider1)
self.setLayout(layout)
def valueChange(self):
size = self.sender().value()
print("当前值是:%s" % size)
self.label.setFont(QFont("Aisa", size))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QSliderDemo()
main.show()
sys.exit(app.exec_())
9.1.通用对话框
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QDialogDemo(QMainWindow):
def __init__(self):
super(QDialogDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("对话框案例")
self.resize(300, 400)
button = QPushButton(self)
button.move(100, 100)
button.setText("打开对话框")
button.clicked.connect(self.showDialog)
def showDialog(self):
dialog = QDialog()
dialog.setWindowTitle("对话框")
button = QPushButton("确定", dialog)
dialog.setWindowModality(Qt.ApplicationModal)
button.clicked.connect(dialog.close)
button.move(50, 50)
dialog.exec() #显示对话框
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QDialogDemo()
main.show()
sys.exit(app.exec_())
10.1.消息对话框
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QMessageDemo(QWidget):
def __init__(self):
super(QMessageDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("不同类型消息对话框")
self.resize(400, 600)
layout = QVBoxLayout()
self.button1 = QPushButton()
self.button1.setText("显示关于对话框")
self.button1.clicked.connect(self.showDialog)
self.button2 = QPushButton()
self.button2.setText("显示信息对话框")
self.button2.clicked.connect(self.showDialog)
self.button3 = QPushButton()
self.button3.setText("显示警告对话框")
self.button3.clicked.connect(self.showDialog)
self.button4 = QPushButton()
self.button4.setText("显示错误对话框")
self.button4.clicked.connect(self.showDialog)
layout.addWidget(self.button1)
layout.addWidget(self.button2)
layout.addWidget(self.button3)
layout.addWidget(self.button4)
self.setLayout(layout)
def showDialog(self):
text = self.sender().text()
if text == "显示关于对话框":
QMessageBox.about(self, '关于', '天心数据开发!')
elif text == "显示信息对话框":
QMessageBox.information(self, '消息', '这是个提示消息对话框!')
elif text == "显示警告对话框":
QMessageBox.warning(self, '警告', '这是个警告对话框!', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
elif text == "显示错误对话框":
QMessageBox.critical(self, '错误', '这是个错误对话框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QMessageDemo()
main.show()
sys.exit(app.exec_())
11.1.不同类型的输入对话框和值的获取
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QInputDialogDemo(QWidget):
def __init__(self):
super(QInputDialogDemo, self).__init__()
self.initUI()
def initUI(self):
layout = QFormLayout()
self.setWindowTitle("不同类型的输入对话框")
self.resize(300, 400)
self.button1 = QPushButton("获取列表中的选项")
self.lineEdit1 = QLineEdit()
self.button1.clicked.connect(self.getItem)
layout.addRow(self.button1, self.lineEdit1)
self.button2 = QPushButton("获取字符串")
self.lineEdit2 = QLineEdit()
self.button2.clicked.connect(self.getText)
layout.addRow(self.button2, self.lineEdit2)
self.button3 = QPushButton("获取整数")
self.lineEdit3 = QLineEdit()
self.button3.clicked.connect(self.getNum)
layout.addRow(self.button3, self.lineEdit3)
self.setLayout(layout)
def getItem(self):
items = ("C", "Python", "PHP", "Java")
item, ok = QInputDialog.getItem(self, '请选择编程语言', '语言列表', items)
if ok and item:
self.lineEdit1.setText(item)
def getText(self):
text, ok = QInputDialog.getText(self, '文本输入框', '姓名')
if ok and text:
self.lineEdit2.setText(text)
def getNum(self):
num, ok = QInputDialog.getInt(self, '整数输入框', '数字')
if ok and num:
self.lineEdit3.setText(str(num))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QInputDialogDemo()
main.show()
sys.exit(app.exec_())
12.1选择设置字体
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QFontDialogDemo(QWidget):
def __init__(self):
super(QFontDialogDemo, self).__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.setWindowTitle("字体对话框")
self.button1 = QPushButton("选择字体")
self.button1.clicked.connect(self.getFont)
self.label1 = QLabel("你好 陌生人")
layout.addWidget(self.label1)
layout.addWidget(self.button1)
self.setLayout(layout)
def getFont(self):
font, ok = QFontDialog.getFont(self)
if ok:
self.label1.setFont(font)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QFontDialogDemo()
main.show()
sys.exit(app.exec_())
13.设置颜色对话框
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QFontDialogDemo(QWidget):
def __init__(self):
super(QFontDialogDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QColor Dialog例子")
self.resize(400, 300)
layout = QVBoxLayout()
self.button1 = QPushButton("设置文字颜色")
self.button1.clicked.connect(self.getColor)
layout.addWidget(self.button1)
self.button2 = QPushButton("设置背景颜色")
self.button2.clicked.connect(self.getBgColor)
layout.addWidget(self.button2)
self.label = QLabel("天心数据")
layout.addWidget(self.label)
self.setLayout(layout)
def getColor(self):
color = QColorDialog.getColor() #颜色对话框
p = QPalette() #色板
p.setColor(QPalette.WindowText, color) #设置改变文字色板颜色
self.label.setPalette(p) #用色板来调节lable颜色
def getBgColor(self):
color = QColorDialog.getColor()
p = QPalette()
p.setColor(QPalette.Window, color)
self.label.setAutoFillBackground(True)
self.label.setPalette(p)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QFontDialogDemo()
main.show()
sys.exit(app.exec_())
14.1文件对话框QDialog
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QDialogDemo(QWidget):
def __init__(self):
super(QDialogDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("文件对话框案例")
self.resize(300, 400)
layout = QVBoxLayout()
self.button1 = QPushButton("加载图片")
self.button1.clicked.connect(self.loadImg)
layout.addWidget(self.button1)
self.button2 = QPushButton("加载文本")
self.button2.clicked.connect(self.loadText)
layout.addWidget(self.button2)
self.imgLabel = QLabel()
layout.addWidget(self.imgLabel)
self.connents = QTextEdit()
layout.addWidget(self.connents)
self.setLayout(layout)
def loadImg(self):
fname, _ = QFileDialog.getOpenFileName(self, '打开文件', '.', '图文件(*.png, *.jpg)')
self.imgLabel.setPixmap(QPixmap(fname))
def loadText(self):
dialog = QFileDialog()
dialog.setFileMode(QFileDialog.AnyFile)
dialog.setFilter(QDir.Files)
if dialog.exec():
filenames = dialog.selectedFiles()
f = open(filenames[0], encoding="utf-8", mode='r')
with f:
data = f.read()
self.connents.setText(data)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QDialogDemo()
main.show()
sys.exit(app.exec_())
16.1.用画笔工具绘制象素点
import sys, math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qt
class DrawPoints(QWidget):
def __init__(self):
super(DrawPoints, self).__init__()
self.setWindowTitle("在窗口上绘制正弦曲线")
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
painter.setPen(Qt.red)
size = self.size()
for i in range(1000):
x = 100*(-1 + 2.0*i/1000) + size.width()/2
y = -50 * math.sin((x -size.width()/2)*math.pi/50) + size.height()/2
painter.drawPoint(x, y)
painter.end()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DrawPoints()
main.show()
sys.exit(app.exec_())
16.1.用画笔绘制不同类型的直接
import sys, math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont, QPen
from PyQt5.QtCore import Qt
class DrawMutilineDemo(QWidget):
def __init__(self):
super(DrawMutilineDemo, self).__init__()
self.setWindowTitle("在窗口上绘制任意曲线")
self.resize(300, 400)
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 3, Qt.SolidLine)
painter.setPen(pen)
painter.drawLine(20, 40, 250, 40)
pen.setStyle(Qt.DashLine)
painter.setPen(pen) #修改了画笔,需要重新设置下才会生效
painter.drawLine(20, 60, 250, 60)
pen.setStyle(Qt.DashDotDotLine)
painter.setPen(pen)
painter.drawLine(20, 80, 250, 80)
pen.setStyle(Qt.DotLine)
painter.setPen(pen)
painter.drawLine(20, 100, 250, 100)
pen.setStyle(Qt.DashDotLine)
painter.setPen(pen)
painter.drawLine(20, 120, 250, 120)
pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([1, 5, 10, 15])
painter.setPen(pen)
painter.drawLine(20, 140, 250, 160)
painter.end()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DrawMutilineDemo()
main.show()
sys.exit(app.exec_())
17.1.绘制弧,扇形,圆,弦,任意多边形,图片
import sys, math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont, QPen, QPolygon, QImage
from PyQt5.QtCore import Qt, QRect, QPoint
class DrawAllDemo(QWidget):
def __init__(self):
super(DrawAllDemo, self).__init__()
self.setWindowTitle("在窗口上绘制任意图象")
self.resize(400, 600)
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
qp.setPen(Qt.red)
#绘制弧
rect = QRect(40, 40, 100, 100) #设置弧区域
qp.drawArc(rect, 0, 90*16)
#通过弧度绘制圆
qp.drawArc(160, 40, 100, 100, 0, 360*16)
#带弦的弧
qp.drawChord(40, 120, 100, 100, 0, 90*16)
#绘扇形
qp.drawPie(10, 240, 100, 100, 0, 60*16)
#绘制椭圆
qp.drawEllipse(40, 360, 150, 100)
#绘制多边形
point1 = QPoint(100, 500)
point2 = QPoint(300, 500)
point3 = QPoint(150, 400)
point4 = QPoint(450, 550)
polygon = QPolygon([point1, point2, point3, point4])
qp.drawPolygon(polygon)
#绘制图象
image = QImage(".\image\logo.png")
rect = QRect(40, 500, image.width(), image.height())
qp.drawImage(rect, image)
qp.end()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DrawAllDemo()
main.show()
sys.exit(app.exec_())
18.1.笔刷填充图形区域
import sys, math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont, QPen, QPolygon, QImage, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
class DrawAllDemo(QWidget):
def __init__(self):
super(DrawAllDemo, self).__init__()
self.setWindowTitle("用笔刷填充矩形")
self.resize(600, 600)
def paintEvent(self, event):
panit = QPainter()
panit.begin(self)
brush = QBrush(Qt.SolidPattern)
panit.setBrush(brush)
panit.drawRect(10, 40,90, 60)
brush = QBrush(Qt.Dense1Pattern)
panit.setBrush(brush)
panit.drawRect(130, 40, 90, 60)
brush = QBrush(Qt.Dense2Pattern)
panit.setBrush(brush)
panit.drawRect(240, 40, 90, 60)
brush = QBrush(Qt.Dense3Pattern)
panit.setBrush(brush)
panit.drawRect(10, 110, 90, 60)
panit.end()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DrawAllDemo()
main.show()
sys.exit(app.exec_())
19.1.用法,需要设置允许拖动和接收2个事件.
import sys, math
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QFormLayout, QLabel, QLineEdit
from PyQt5.QtGui import QPainter, QColor, QFont, QPen, QPolygon, QImage, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
class MyComboBox(QComboBox):
def __init__(self):
super(MyComboBox, self).__init__()
self.setAcceptDrops(True) #允许接收
def dragEnterEvent(self, e):#拖进去时触发
print(e)
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
def dropEvent(self, e): #松开鼠标触发
self.addItem(e.mimeData().text())
class DragDropDemo(QWidget):
def __init__(self):
super(DragDropDemo, self).__init__()
self.resize(600, 600)
formlayout = QFormLayout()
formlayout.addRow(QLabel("把左边的文字,拖到右边的控件选项中去"))
lineEdit = QLineEdit()
lineEdit.setDragEnabled(True) #让控件可以拖动
mycombobox = MyComboBox()
formlayout.addRow(lineEdit, mycombobox)
self.setLayout(formlayout)
self.setWindowTitle("拖拽控制案例")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DragDropDemo()
main.show()
sys.exit(app.exec_())
20.1.应用中剪贴板的文本,html,图片库复制和粘,贴
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ClipBoradDemo(QDialog):
def __init__(self):
super(ClipBoradDemo, self).__init__()
textCopyButton = QPushButton("复制文本")
textPasteButton = QPushButton("粘贴文本")
htmlCopyButton = QPushButton("复制Html")
htmlPasteButton = QPushButton("粘贴Html")
imageCopyButton = QPushButton("复制图象")
imagePasteButton = QPushButton("粘贴图象")
self.textLabel = QLabel("默认文本")
self.imgLabel = QLabel()
layout = QGridLayout()
layout.addWidget(textCopyButton, 0, 0)
layout.addWidget(htmlCopyButton, 0, 1)
layout.addWidget(imageCopyButton, 0, 2)
layout.addWidget(textPasteButton, 1, 0)
layout.addWidget(htmlPasteButton, 1, 1)
layout.addWidget(imagePasteButton, 1, 2)
layout.addWidget(self.textLabel, 2, 0)
layout.addWidget(self.imgLabel,2, 0)
textCopyButton.clicked.connect(self.copyText)
textPasteButton.clicked.connect(self.pasteText)
htmlCopyButton.clicked.connect(self.copyHtml)
htmlPasteButton.clicked.connect(self.pasteHtml)
imageCopyButton.clicked.connect(self.copyImg)
imagePasteButton.clicked.connect(self.pasteImg)
self.setLayout(layout)
def copyText(self):
clipboard = QApplication.clipboard()
clipboard.setText("hello Worald")
def pasteText(self):
clipBoard = QApplication.clipboard()
print(clipBoard.text())
self.textLabel.setText(clipBoard.text())
def copyHtml(self):
mimeData = QMimeData()
mimeData.setHtml("<b>bold <font color=red>red</font></b>")
clipboard = QApplication.clipboard()
clipboard.setMimeData(mimeData)
def pasteHtml(self):
clipboard = QApplication.clipboard()
mimeData = clipboard.mimeData()
if mimeData.hasHtml():
self.textLabel.setText(mimeData.html())
def copyImg(self):
clipboard = QApplication.clipboard()
clipboard.setPixmap(QPixmap('./image/logo.png'))
print("copy img")
def pasteImg(self):
clipboard = QApplication.clipboard()
self.imgLabel.setPixmap(clipboard.pixmap())
print("paste img")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = ClipBoradDemo()
main.show()
sys.exit(app.exec_())
21.1.日历控件日期获取和显示
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyCalenderDemo(QWidget):
def __init__(self):
super(MyCalenderDemo, self).__init__()
self.initUI()
def initUI(self):
self.resize(400, 800)
self.calender = QCalendarWidget(self)
self.calender.setMinimumDate(QDate(1988, 1,1))
self.calender.setMaximumDate(QDate(2088, 1, 1))
self.calender.setGridVisible(True)
self.calender.clicked.connect(self.showDate)
self.calender.move(20,20)
self.label = QLabel(self)
self.label.move(20, 400)
date = self.calender.selectedDate()
self.label.setText(date.toString("yyyy-MM-dd dddd"))
self.setWindowTitle("日历演示")
def showDate(self, date):
# self.label.setText(date.toString("yyyy-MM-dd dddd"))
self.label.setText(self.calender.selectedDate().toString("yyyy-MM-dd dddd"))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyCalenderDemo()
main.show()
sys.exit(app.exec_())
22.1.显示格式QDateTimeEdit
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyDateTime(QWidget):
def __init__(self):
super(MyDateTime, self).__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.setWindowTitle("不同风格的日期显示修改")
self.resize(400, 600)
dateTimeEditor1 = QDateTimeEdit() #设置控件显示的时间
dateTimeEditor2 = QDateTimeEdit(QDateTime.currentDateTime())
dateEditor = QDateTimeEdit(QDate.currentDate())
timeEditor = QDateTimeEdit(QTime.currentTime())
dateTimeEditor2.setMinimumDate(QDate.currentDate().addDays(-365))
dateTimeEditor2.setMaximumDate(QDate.currentDate().addDays(365))
dateTimeEditor2.setCalendarPopup(True)
dateTimeEditor1.dateChanged.connect(self.ondateChange)
dateTimeEditor1.timeChanged.connect(self.ontimeChange)
dateTimeEditor1.dateTimeChanged.connect(self.ondateTimeChange)
dateTimeEditor1.setDisplayFormat("yyyy-MM-dd HH:mm:ss") #设置显示的格式
dateTimeEditor2.setDisplayFormat("yyyy/MM/dd HH-mm-ss")
dateEditor.setDisplayFormat("yy.MM.dd")
timeEditor.setDisplayFormat("HH:mm:ss")
layout.addWidget(dateTimeEditor1)
layout.addWidget(dateTimeEditor2)
layout.addWidget(dateEditor)
layout.addWidget(timeEditor)
self.setLayout(layout)
def ontimeChange(self, time):
print(time)
def ondateChange(self, date):
print(date)
def ondateTimeChange(self, datetime):
print(datetime)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyDateTime()
main.show()
sys.exit(app.exec_())
23.1.菜单添加设置和触发
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class Menu(QMainWindow):
def __init__(self):
super(Menu, self).__init__()
self.resize(300, 400)
self.setWindowTitle("菜单测试")
bar = self.menuBar() #获取菜单
file = bar.addMenu("文件")#新建菜单
new = file.addAction("新建")
new.setShortcut("Ctrl + N")
save = QAction("保存", self)
save.setShortcut("Ctrl + S")
file.addAction(save)
save.triggered.connect(self.process)
new.triggered.connect(self.process)
edit = bar.addMenu("编辑")
copy = edit.addAction("复制")
paste = edit.addAction("粘贴")
copy.triggered.connect(self.process)
paste.triggered.connect(self.process)
def process(self):
print(self.sender().text())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = Menu()
main.show()
sys.exit(app.exec_())
24,.1.工具栏的创建,触发,显示样式
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyTool(QMainWindow):
def __init__(self):
super(MyTool, self).__init__()
self.initUI()
def initUI(self):
self.resize(300, 400)
self.setWindowTitle("工具栏测试")
tb1 = self.addToolBar("File")
newpng = QAction(QIcon('./image/New.png'), "新建", self)
openpng = QAction( QIcon('./image/Open.png'), "open", self )
savepng = QAction(QIcon('./image/Save.png'), "save", self)
tb1.addAction(newpng)
tb1.addAction(openpng)
tb1.addAction(savepng)
# tb1.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)#设置提示文本样式
tb2 = self.addToolBar("second")
newpng2 = QAction(QIcon("./image/New.png"), "NEW", self)
tb2.addAction(newpng2)
tb2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
tb1.actionTriggered.connect(self.toolbarprocess)
tb2.actionTriggered.connect(self.toolbarprocess)
def toolbarprocess(self, a):
print("当前按下的按钮是:", a.text())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyTool()
main.show()
sys.exit(app.exec_())
24.1.设置状态栏
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyStatusBar(QMainWindow):
def __init__(self):
super(MyStatusBar, self).__init__()
self.initUI()
def initUI(self):
self.resize(300, 400)
self.setWindowTitle("状态栏测试")
bar = self.menuBar() #建立菜单
file = bar.addMenu("File") #建立菜单选项
file.addAction("show") #添加子选项
self.setCentralWidget(QTextEdit())
self.sb = QStatusBar()
self.setStatusBar(self.sb) #设置状态栏
file.triggered.connect(self.processTrigger)
def processTrigger(self, p):
if p.text() == "show":
self.sb.showMessage(p.text() + "菜单被点击了", 5000)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyStatusBar()
main.show()
sys.exit(app.exec_())
25.1.QtabelView表格控件显示
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MyStatusBar(QWidget):
def __init__(self):
super(MyStatusBar, self).__init__()
self.initUI()
def initUI(self):
self.resize(600, 400)
self.setWindowTitle("QtabelView表格视图控件显示")
self.model = QStandardItemModel(4, 3)
self.model.setHorizontalHeaderLabels(["id", "姓名", "age"])
self.tabelView = QTableView()
self.tabelView.setModel(self.model) #关联model
item00 = QStandardItem("1")
item01 = QStandardItem("天心")
item02 = QStandardItem("28")
item10 = QStandardItem("2")
item11 = QStandardItem("泥泥")
item12 = QStandardItem("33")
self.model.setItem(0, 0, item00)
self.model.setItem(0, 1, item01)
self.model.setItem(0, 2, item02)
self.model.setItem(1, 0, item10)
self.model.setItem(1, 1, item11)
self.model.setItem(1, 2, item12)
layout = QVBoxLayout()
layout.addWidget(self.tabelView)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyStatusBar()
main.show()
sys.exit(app.exec_())
26.1.QlistView显示列数据
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ListViewDemo(QWidget):
def __init__(self):
super(ListViewDemo, self).__init__()
self.initUI()
def initUI(self):
self.resize(600, 400)
self.setWindowTitle("QListView列表视图控件显示")
layout = QVBoxLayout()
listview = QListView()
listmode = QStringListModel() #建立个空的model
self.list = ["列表项1", "列表项2", "列表项3",] #建立数据
listmode.setStringList(self.list) #把数据关联model
listview.setModel(listmode) #设置listview的数据
listview.clicked.connect(self.clicked)
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_())
26.1.显示,触发
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QlistWidgetDemo(QMainWindow):
def __init__(self):
super(QlistWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QlistWidget扩展的列表控件")
self.listWidget = QListWidget()
self.listWidget.addItem("PYTHON")
self.listWidget.addItem("PHP")
self.listWidget.addItem("JAVA")
self.listWidget.addItem("NET")
self.listWidget.itemClicked.connect(self.clicked)
self.setCentralWidget(self.listWidget)
def clicked(self, index):
print(self.listWidget.item(self.listWidget.row(index)).text()) #先获取 行,通过行找item.在用text打印文本
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_())
27.1.设置表格的数据,样式
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QTabelWidgetDemo(QWidget):
def __init__(self):
super(QTabelWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTabelWidget扩展的表格控件")
layout = QHBoxLayout()
tabelWidget = QTableWidget()
tabelWidget.setColumnCount(3) #设置表格多少列
tabelWidget.setRowCount(4) #设置表格多少行
tabelWidget.setHorizontalHeaderLabels(["姓名", "年龄", "籍贯"])
nameitem = QTableWidgetItem("小明")
ageitem = QTableWidgetItem("22")
additem = QTableWidgetItem("汉")
tabelWidget.setItem(0, 0, nameitem)
tabelWidget.setItem(0, 1, ageitem)
tabelWidget.setItem(0, 2, additem)
nameitem = QTableWidgetItem("小鸽")
ageitem = QTableWidgetItem("29")
additem = QTableWidgetItem("汉")
tabelWidget.setItem(1, 0, nameitem)
tabelWidget.setItem(1, 1, ageitem)
tabelWidget.setItem(1, 2, additem)
tabelWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) #表格设置为不可编辑
tabelWidget.setSelectionBehavior(QAbstractItemView.SelectRows) #选择整行
tabelWidget.resizeColumnsToContents() #调整单元格列自适应内容
# tabelWidget.resizeRowsToContents() #调整单元行自适应内容
tabelWidget.horizontalHeader().setVisible(False) #设置不显示水平表头
# tabelWidget.verticalHeader().setVisible(False) #设置不显示垂直表头
tabelWidget.setVerticalHeaderLabels(['a', 'b'])
tabelWidget.setShowGrid(False)
layout.addWidget(tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QTabelWidgetDemo()
main.show()
sys.exit(app.exec_())
28.1.表格的单元格放文本,控制方法
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class PlaceControllInCellDemo(QWidget):
def __init__(self):
super(PlaceControllInCellDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格单元格中放置控件")
self.resize(430, 300)
layout = QHBoxLayout()
tabelWidget = QTableWidget()
tabelWidget.setRowCount(4)
tabelWidget.setColumnCount(3)
tabelWidget.setHorizontalHeaderLabels(["name", "sex", "age"])
textItem = QTableWidgetItem("泥泥")
tabelWidget.setItem(0, 0, textItem) #将文本放在单元格中
combox = QComboBox()
combox.addItem('男')
combox.addItem('女')
combox.setStyleSheet("QComboBox{margin:3px;}") #QSS设置样式
tabelWidget.setCellWidget(0, 1,combox) #将控件放在单元格中
button = QPushButton("修改")
tabelWidget.setStyleSheet("QPushButton{margin:3px}")
tabelWidget.setCellWidget(0, 2, button)
layout.addWidget(tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = PlaceControllInCellDemo()
main.show()
sys.exit(app.exec_())
29.1.单元格的搜索后定位,设置前,背景色颜色
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class DataLocation(QWidget):
def __init__(self):
super(DataLocation, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格单元格中放置控件")
self.resize(430, 300)
layout = QVBoxLayout()
self.tabel = QTableWidget()
self.tabel.setRowCount(40)
self.tabel.setColumnCount(4)
for i in range(40):
for j in range(4):
itemContent = '%d, %d' %(i, j)
self.tabel.setItem(i, j, QTableWidgetItem(itemContent))
self.text = QLineEdit()
self.searchBtn = QPushButton("搜索")
self.searchBtn.clicked.connect(self.search)
layout.addWidget(self.text)
layout.addWidget(self.searchBtn)
layout.addWidget(self.tabel)
self.setLayout(layout)
def search(self):
print(self.text.text())
items = self.tabel.findItems(self.text.text(), Qt.MatchExactly)
if len(items) > 0:
item = items[0] #满足条件的第一个值
item.setBackground(QBrush(QColor(0, 255, 0))) #设置背景色颜色
item.setForeground(QBrush(QColor(255, 0, 0)))
row = item.row() #获取当前所在的行号
self.tabel.verticalScrollBar().setSliderPosition(row) #定位滚动条到指定的行
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DataLocation()
main.show()
sys.exit(app.exec_())
30.1.单元格颜色,大小,字体设置
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CellFontColor(QWidget):
def __init__(self):
super(CellFontColor, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格单元格的颜色和字体大小")
self.resize(400, 300)
layout = QHBoxLayout()
tabelWidget = QTableWidget()
tabelWidget.setColumnCount(3) #设置表格多少列
tabelWidget.setRowCount(4) #设置表格多少行
newItem = QTableWidgetItem("雷神")
newItem.setFont(QFont("Times", 14, QFont.Black)) #设置字体,大小.黑体
newItem.setForeground(QBrush(QColor(255,0, 0))) #设置颜色为红色
tabelWidget.setItem(0, 0, newItem)
newItem = QTableWidgetItem("女")
newItem.setForeground(QBrush(QColor(255, 255, 0)))
newItem.setBackground(QBrush(QColor(0, 255, 0))) #设置背景色
tabelWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem("80")
newItem.setFont(QFont("Times", 16, QFont.Normal))
newItem.setForeground(QBrush(QColor(0, 255, 0)))
tabelWidget.setItem(0, 2, newItem)
layout.addWidget(tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = CellFontColor()
main.show()
sys.exit(app.exec_())
31.1.升,降序排序列
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CellFontColor(QWidget):
def __init__(self):
super(CellFontColor, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格列排序")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "Weight"])
newitem = QTableWidgetItem("张三")
self.tabelWidget.setItem(0, 0, newitem)
newitem = QTableWidgetItem("男")
self.tabelWidget.setItem(0, 1, newitem)
newitem = QTableWidgetItem("120")
self.tabelWidget.setItem(0, 2, newitem)
newitem = QTableWidgetItem("李四")
self.tabelWidget.setItem(1, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(1, 1, newitem)
newitem = QTableWidgetItem("150")
self.tabelWidget.setItem(1, 2, newitem)
newitem = QTableWidgetItem("王五")
self.tabelWidget.setItem(2, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(2, 1, newitem)
newitem = QTableWidgetItem("110")
self.tabelWidget.setItem(2, 2, newitem)
self.btn = QPushButton('排序')
# self.tabelWidget.setCellWidget(3, 2, self.btn)
self.orderType = Qt.DescendingOrder #设置默认升序
self.btn.clicked.connect(self.sort)
layout.addWidget(self.tabelWidget)
layout.addWidget(self.btn)
self.setLayout(layout)
def sort(self):
if self.orderType == Qt.DescendingOrder: #实现按钮切换
self.orderType = Qt.AscendingOrder
else:
self.orderType = Qt.DescendingOrder
self.tabelWidget.sortItems(2, self.orderType) #实现排序
if __name__ == "__main__":
app = QApplication(sys.argv)
main = CellFontColor()
main.show()
sys.exit(app.exec_())
32.1.表格中文本对齐方式
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class TextAlignDemo(QWidget):
def __init__(self):
super(TextAlignDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格列排序")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "Weight"])
newitem = QTableWidgetItem("张三")
newitem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
self.tabelWidget.setItem(0, 0, newitem)
newitem = QTableWidgetItem("男")
newitem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.tabelWidget.setItem(0, 1, newitem)
newitem = QTableWidgetItem("120")
newitem.setTextAlignment(Qt.AlignRight)
self.tabelWidget.setItem(0, 2, newitem)
newitem = QTableWidgetItem("李四")
newitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.tabelWidget.setItem(1, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(1, 1, newitem)
newitem = QTableWidgetItem("150")
self.tabelWidget.setItem(1, 2, newitem)
newitem = QTableWidgetItem("王五")
self.tabelWidget.setItem(2, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(2, 1, newitem)
newitem = QTableWidgetItem("110")
self.tabelWidget.setItem(2, 2, newitem)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = TextAlignDemo()
main.show()
sys.exit(app.exec_())
33.1.表格中单元格合并
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class SpanDemo(QWidget):
def __init__(self):
super(SpanDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("单元格合并")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "Weight"])
newitem = QTableWidgetItem("雷神")
self.tabelWidget.setItem(0, 0, newitem)
self.tabelWidget.setSpan(0, 0, 3, 1) #0, 0单元格,占用3行,1列
newitem = QTableWidgetItem("男")
self.tabelWidget.setItem(0, 1, newitem)
self.tabelWidget.setSpan(0, 1, 2, 1)
newitem = QTableWidgetItem("120")
self.tabelWidget.setItem(0, 2, newitem)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = SpanDemo()
main.show()
sys.exit(app.exec_())
三十四.表格设置行,列大小
34.1.设置表格的行高,列宽
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CellSizeDemo(QWidget):
def __init__(self):
super(CellSizeDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格列排序")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "Weight"])
newitem = QTableWidgetItem("张三")
self.tabelWidget.setRowHeight(0, 100) #设置行高
newitem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
self.tabelWidget.setItem(0, 0, newitem)
newitem = QTableWidgetItem("男")
newitem.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.tabelWidget.setColumnWidth(1, 200) #设置列宽
self.tabelWidget.setItem(0, 1, newitem)
newitem = QTableWidgetItem("120")
newitem.setTextAlignment(Qt.AlignRight)
self.tabelWidget.setItem(0, 2, newitem)
newitem = QTableWidgetItem("李四")
newitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.tabelWidget.setItem(1, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(1, 1, newitem)
newitem = QTableWidgetItem("150")
self.tabelWidget.setItem(1, 2, newitem)
newitem = QTableWidgetItem("王五")
self.tabelWidget.setItem(2, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(2, 1, newitem)
newitem = QTableWidgetItem("110")
self.tabelWidget.setItem(2, 2, newitem)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = CellSizeDemo()
main.show()
sys.exit(app.exec_())
34.1.表格中的单元格如何放图片和文字
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CellImageDemo(QWidget):
def __init__(self):
super(CellImageDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("单元格中显示图片")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "头象"])
newitem = QTableWidgetItem("小明")
self.tabelWidget.setItem(0, 0, newitem)
newitem = QTableWidgetItem("男")
self.tabelWidget.setItem(0, 1, newitem)
newitem = QTableWidgetItem(QIcon("./image/logo.png"), "天心数据") #放图片
self.tabelWidget.setItem(0, 2, newitem)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = CellImageDemo()
main.show()
sys.exit(app.exec_())
三十五.单元格设置显示图片大小
35.1.设置单元格和图片大小
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CellImageSizeDemo(QWidget):
def __init__(self):
super(CellImageSizeDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格列排序")
self.resize(1000, 900)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setIconSize(QSize(200, 60)) #设置单元格所有图片显示大小
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(5) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["图片1", "图片2", "图片3"])
#设置单元格和图片一样大
for i in range(5):
self.tabelWidget.setRowHeight(i, 60)
for j in range(3):
self.tabelWidget.setColumnWidth(j, 200)
#单元格中放图片
for i in range(5):
for j in range(3):
newitem = QTableWidgetItem()
newitem.setIcon(QIcon("./image/logo.png"))
self.tabelWidget.setItem(i, j, newitem)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = CellImageSizeDemo()
main.show()
sys.exit(app.exec_())
三十六.设置表格中的上下文
36.1.设置表格右键的菜单项
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class TabelWidgetContextDemo(QWidget):
def __init__(self):
super(TabelWidgetContextDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("表格中显示上下文菜单")
self.resize(400, 300)
layout = QVBoxLayout()
self.tabelWidget = QTableWidget()
self.tabelWidget.setColumnCount(3) #设置表格多少列
self.tabelWidget.setRowCount(4) #设置表格多少行
self.tabelWidget.setHorizontalHeaderLabels(["Name", "Sex", "Weight"])
newitem = QTableWidgetItem("张三")
self.tabelWidget.setItem(0, 0, newitem)
newitem = QTableWidgetItem("男")
self.tabelWidget.setItem(0, 1, newitem)
newitem = QTableWidgetItem("120")
self.tabelWidget.setItem(0, 2, newitem)
newitem = QTableWidgetItem("李四")
newitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.tabelWidget.setItem(1, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(1, 1, newitem)
newitem = QTableWidgetItem("150")
self.tabelWidget.setItem(1, 2, newitem)
newitem = QTableWidgetItem("王五")
self.tabelWidget.setItem(2, 0, newitem)
newitem = QTableWidgetItem("女")
self.tabelWidget.setItem(2, 1, newitem)
newitem = QTableWidgetItem("110")
self.tabelWidget.setItem(2, 2, newitem)
self.tabelWidget.setContextMenuPolicy(Qt.CustomContextMenu) #允许弹出上下文菜单
self.tabelWidget.customContextMenuRequested.connect(self.generateMenu)
layout.addWidget(self.tabelWidget)
self.setLayout(layout)
def generateMenu(self, pos):
print(pos)
for i in self.tabelWidget.selectionModel().selection().indexes(): #循环选中行的索引
print(i) #输出<PyQt5.QtCore.QModelIndex object at 0x0000000002D84B38>
rowNum = i.row()
print(rowNum) #输出选中的单元格所在行号
if rowNum < 2: #如果选中是前2行,
menu = QMenu()
item1 = menu.addAction("删除")
item2 = menu.addAction("剪切")
item3 = menu.addAction("粘贴")
#坐标映射到全局
screenPos = self.tabelWidget.mapToGlobal(pos)
# 被阻塞,除非你单击菜单项
action = menu.exec(screenPos)
if action == item1:
print("你选中第1个菜单项:",
self.tabelWidget.item(rowNum, 0).text(),
self.tabelWidget.item(rowNum, 1).text(),
self.tabelWidget.item(rowNum, 2).text(),
)
elif action == item2:
print("你选中第2个菜单项:",
self.tabelWidget.item(rowNum, 0).text(),
self.tabelWidget.item(rowNum, 1).text(),
self.tabelWidget.item(rowNum, 2).text(),
)
elif action == item3:
print("你选中第3个菜单项:",
self.tabelWidget.item(rowNum, 0).text(),
self.tabelWidget.item(rowNum, 1).text(),
self.tabelWidget.item(rowNum, 2).text(),
)
else:
return
if __name__ == "__main__":
app = QApplication(sys.argv)
main = TabelWidgetContextDemo()
main.show()
sys.exit(app.exec_())
37.1.树控件的设置,展开,添加图标基本用法
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class BaseTreeWidgetDemo(QMainWindow):
def __init__(self):
super(BaseTreeWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("基本树控件")
self.tree = QTreeWidget()
#指定树的列数
self.tree.setColumnCount(2)
#指定列标签
self.tree.setHeaderLabels(['key', 'value'])
root = QTreeWidgetItem(self.tree)
root.setText(0, "根节点")
root.setIcon(0, QIcon('.\image\open.png'))
self.tree.setColumnWidth(0, 150)
#添加子节点1
child1 = QTreeWidgetItem(root)
child1.setText(0, "子节点1")
child1.setText(1, "子节点1的数据")
child1.setIcon(0, QIcon("./image/logo.png"))
child1.setCheckState(0, Qt.Checked) #添加复选框
child2 = QTreeWidgetItem(root)
child2.setText(0, "子节点2")
child2.setText(1, "子节点2数据")
child2.setIcon(0, QIcon("./image/logo.png"))
child3 = QTreeWidgetItem(child2)
child3.setText(0, "子节点2-1")
child3.setText(1,"新的值")
self.tree.expandAll()
self.setCentralWidget(self.tree)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = BaseTreeWidgetDemo()
main.show()
sys.exit(app.exec_())
38.1.树节点响应事件
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class TreeEventDemo(QMainWindow):
def __init__(self):
super(TreeEventDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("树控件响应事件")
self.tree = QTreeWidget()
self.tree.setColumnCount(2)
self.tree.setHeaderLabels(["key", "value"])
root = QTreeWidgetItem(self.tree)
root.setText(0, 'root')
root.setText(1, '根节点数据')
child1 = QTreeWidgetItem(root)
child1.setText(0, "child1")
child1.setText(1, 'child1数据')
child2 = QTreeWidgetItem(root)
child2.setText(0, "child2")
child2.setText(1, "child2数据")
child3 = QTreeWidgetItem(child2)
child3.setText(0, "child3")
child3.setText(1, "child3数据")
self.tree.expandAll()
self.tree.clicked.connect(self.onclickTree)
self.setCentralWidget(self.tree)
def onclickTree(self, index):
item = self.tree.currentItem()
print("节点索引:%d" %(index.row())) #此处的节点索引,是相对于当前的父节点.是第几个.
print('key=%s, value=%s' %(item.text(0), item.text(1)))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = TreeEventDemo()
main.show()
sys.exit(app.exec_())
39.1.树节点的增加,删除,修改
import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ModifyTreeDemo(QWidget):
def __init__(self):
super(ModifyTreeDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("动态修改树控件")
layout = QVBoxLayout()
addbtn = QPushButton("增加节点")
updatebtn = QPushButton("更新节点")
delbtn = QPushButton("删除节点")
addbtn.clicked.connect(self.addNode)
updatebtn.clicked.connect(self.updateNode)
delbtn.clicked.connect(self.deleteNode)
layout.addWidget(addbtn)
layout.addWidget(updatebtn)
layout.addWidget(delbtn)
self.tree = QTreeWidget()
self.tree.setColumnCount(2)
self.tree.setHeaderLabels(["key", "value"])
root = QTreeWidgetItem(self.tree)
root.setText(0, 'root')
root.setText(1, '根节点数据')
child1 = QTreeWidgetItem(root)
child1.setText(0, "child1")
child1.setText(1, 'child1数据')
child2 = QTreeWidgetItem(root)
child2.setText(0, "child2")
child2.setText(1, "child2数据")
child3 = QTreeWidgetItem(child2)
child3.setText(0, "child3")
child3.setText(1, "child3数据")
self.tree.expandAll()
self.tree.clicked.connect(self.onclickTree)
layout.addWidget(self.tree)
self.setLayout(layout)
def onclickTree(self, index):
item = self.tree.currentItem()
print("节点索引:%d" %(index.row())) #此处的节点索引,是相对于当前的父节点.是第几个.
print('key=%s, value=%s' %(item.text(0), item.text(1)))
def addNode(self):
print("增加节点")
parent = self.tree.currentItem() or self.tree.invisibleRootItem()
newitem = QTreeWidgetItem(parent )
newitem.setText(0, "新增节点")
newitem.setText(1, "新增节点数据")
def updateNode(self):
print("修改节点")
curitem = self.tree.currentItem()
curitem.setText(0, "修改后的节点")
curitem.setText(1, "修改后的值")
def deleteNode(self):
print("删除节点")
curitem = self.tree.currentItem()
root = self.tree.invisibleRootItem() #最顶层节点,的不可见根
for item in self.tree.selectedItems():
print(item.parent())
(item.parent() or root).removeChild(item) #通过父节点移除指定的子节点
if __name__ == "__main__":
app = QApplication(sys.argv)
main = ModifyTreeDemo()
main.show()
sys.exit(app.exec_())
四十.QTreeView控件使用
40.1.显示系统目录树
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
if __name__ == "__main__":
app = QApplication(sys.argv)
model = QDirModel() #显示目录结构模型
tree = QTreeView()
tree.setModel(model)
tree.setWindowTitle('QTreeView')
tree.resize(600, 400)
tree.show()
sys.exit(app.exec_())
41.1.标签页的添加和控件增加
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class TabWidgetDemo(QTabWidget): #继承的类
def __init__(self):
super(TabWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("标签页控件")
self.resize(300, 200)
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()
self.tab3UI()
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("生日:", QCalendarWidget())
self.setTabText(1, "个人详细信息")
self.tab2.setLayout(layout)
def tab3UI(self):
layout = QHBoxLayout()
layout.addWidget(QLabel("学历"))
layout.addWidget(QCheckBox("高中"))
layout.addWidget(QCheckBox("本科"))
self.setTabText(2, "教育")
self.tab3.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = TabWidgetDemo()
main.show()
sys.exit(app.exec_())
42.1.QStackedWidget控件的使用
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QStackWidgetDemo(QWidget): #继承的类
def __init__(self):
super(QStackWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("堆栈页控件")
self.list = QListWidget()
self.list.insertItem(0, "联系方式")
self.list.insertItem(1, "个人信息")
self.list.insertItem(0, "教育程度")
self.list.currentRowChanged.connect(self.display) #点击列表时.切换不同的页面
self.stack1 = QWidget() #建立3个窗口
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 display(self, index):
self.stack.setCurrentIndex(index) #根据索引,切换栈里面的页面
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("生日:", QCalendarWidget())
self.stack2.setLayout(layout)
def tab3UI(self):
layout = QHBoxLayout()
layout.addWidget(QLabel("学历"))
layout.addWidget(QCheckBox("高中"))
layout.addWidget(QCheckBox("本科"))
self.stack3.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QStackWidgetDemo()
main.show()
sys.exit(app.exec_())
43.1.悬浮控制使用
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QDockWidgetDemo(QMainWindow): #继承的类
def __init__(self):
super(QDockWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("停靠控件")
# layout = QHBoxLayout()
self.list = QListWidget()
self.list.addItem("item1")
self.list.addItem("item2")
self.list.addItem("item3")
self.dock = QDockWidget("名字" ,self) #创建悬浮窗口
self.dock.setWidget(self.list)
# self.dock.setFloating(True) #设置窗口默认状态悬浮
self.setCentralWidget(QLineEdit())
self.addDockWidget(Qt.RightDockWidgetArea, self.dock) #当前窗口添加,并指定悬浮区域
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QDockWidgetDemo()
main.show()
sys.exit(app.exec_())
44.1.多文档窗口区域设置和显示
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MutilWindowDemo(QMainWindow): #继承的类
count = 0
def __init__(self):
super(MutilWindowDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("容纳多文档窗口")
self.mdi = QMdiArea() #新建多文档区域
bar = self.menuBar() #新建菜单
file = bar.addMenu("File") #添加选项
file.addAction("New")
file.addAction("Cascade")
file.addAction("Tiled")
file.triggered.connect(self.windowAction)
self.setCentralWidget(self.mdi)
def windowAction(self, q):
if q.text() == "New" :
MutilWindowDemo.count += + 1
sub = QMdiSubWindow() #新建子窗口
sub.setWidget(QTextEdit()) #子窗口添加控件
sub.setWindowTitle("子窗口" + str(MutilWindowDemo.count)) #子窗口设置标题
self.mdi.addSubWindow(sub) #把子窗口添加到文档区域
sub.show() #显示子窗口
elif q.text() == "Cascade":
self.mdi.cascadeSubWindows() #层叠显示
elif q.text() == "Tiled":
self.mdi.tileSubWindows() #平铺显示子窗口
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MutilWindowDemo()
main.show()
sys.exit(app.exec_())
45.1.滚动条改变其它控制状态和位置
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ScrollBarDemo(QWidget): #继承的类
count = 0
def __init__(self):
super(ScrollBarDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("滚动条")
hbox = QHBoxLayout()
self.label = QLabel("我会变化的")
self.scroolBar1 = QScrollBar()
self.scroolBar1.setMaximum(255)
self.scroolBar1.sliderMoved.connect(self.onsliderMove)
self.scroolBar2 = QScrollBar()
self.scroolBar2.setMaximum(255)
self.scroolBar2.sliderMoved.connect(self.onsliderMove)
self.scroolBar3 = QScrollBar()
self.scroolBar3.setMaximum(255)
self.scroolBar3.sliderMoved.connect(self.onsliderMove)
self.scroolBar4 = QScrollBar()
self.scroolBar4.setMaximum(255)
self.scroolBar4.sliderMoved.connect(self.onsliderMove2)
self.y = self.label.y() #保留当前label坐标
hbox.addWidget(self.label)
hbox.addWidget(self.scroolBar1)
hbox.addWidget(self.scroolBar2)
hbox.addWidget(self.scroolBar3)
hbox.addWidget(self.scroolBar4)
self.setLayout(hbox)
self.setGeometry(600, 300, 300, 200)
def onsliderMove(self):
print(self.scroolBar1.value(), self.scroolBar2.value(), self.scroolBar3.value())
p = QPalette() #建立调色板
c = QColor(self.scroolBar1.value(), self.scroolBar2.value(), self.scroolBar3.value(), 255) #设置颜色
p.setColor(QPalette.Foreground, c) #调色板设置前景色
self.label.setPalette(p)
def onsliderMove2(self):
self.label.move(self.label.x(), self.y + self.scroolBar4.value())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = ScrollBarDemo()
main.show()
sys.exit(app.exec_())
46.1.使用定时器实现时间刷新
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ShowTimerDemo(QWidget): #继承的类
count = 0
def __init__(self):
super(ShowTimerDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("定时器显示时间")
self.resize(400, 300)
layout = QGridLayout()
self.label = QLabel(QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
self.startBtn = QPushButton("开始显示")
self.endBtn = QPushButton("结束显示")
self.endBtn.setEnabled(False)
self.timer = QTimer() #建立定时器
self.timer.timeout.connect(self.showTimer) #定时器执行的方法
self.startBtn.clicked.connect(self.startTimer)
self.endBtn.clicked.connect(self.stopTimer)
layout.addWidget(self.label, 0, 0, 1, 2)
layout.addWidget(self.startBtn, 1, 0)
layout.addWidget(self.endBtn, 1, 1)
self.setLayout(layout)
def showTimer(self):
timer = QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
self.label.setText(timer)
def startTimer(self):
self.timer.start(1000) #开启定时器,并设置间隔
self.startBtn.setEnabled(False) #开始按钮禁用
self.endBtn.setEnabled(True) #结束按钮可用
def stopTimer(self):
self.timer.stop()
self.startBtn.setEnabled(True)
self.endBtn.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = ShowTimerDemo()
main.show()
sys.exit(app.exec_())
四十七.定时器静态方法延时执行
47.1.延时执行一段代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("<font size=20 color=red><b>5秒后关闭此窗口</b></font>")
label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint) #设置窗口显示样式
label.show()
QTimer.singleShot(5000, app.quit) #5秒后执行退出程序.此方法适合延时执行一段代码
sys.exit(app.exec_())
48.1.浏览器控件打开网页
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class WebEngineView(QMainWindow):
def __init__(self):
super(WebEngineView, self).__init__()
self.setWindowTitle("打开外部网页例子")
self.setGeometry(30, 50, 1355, 730)
self.browser = QWebEngineView()
self.browser.load(QUrl("https://www.ttgame.net"))
self.setCentralWidget(self.browser)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = WebEngineView()
main.show()
sys.exit(app.exec_())
49.1.装载本地html文件
import sys, os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class WebEngineView(QMainWindow):
def __init__(self):
super(WebEngineView, self).__init__()
self.setWindowTitle("装载本地页面")
self.setGeometry(30, 50, 1355, 730)
self.browser = QWebEngineView()
url = os.getcwd() + "./test.html"
self.browser.load(QUrl.fromLocalFile(url))
self.setCentralWidget(self.browser)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = WebEngineView()
main.show()
sys.exit(app.exec_())
50.1.直接加载html代码
import sys, os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class WebEngineView(QMainWindow):
def __init__(self):
super(WebEngineView, self).__init__()
self.setWindowTitle("直接加载html代码")
self.setGeometry(30, 50, 1355, 730)
self.browser = QWebEngineView()
self.browser.setHtml('''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<h2>pyqt5</h2>
<h3>pyqt5</h3>
<h4>pyqt5</h4>
<h5>pyqt5</h5>
</body>
</html>
''')
self.setCentralWidget(self.browser)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = WebEngineView()
main.show()
sys.exit(app.exec_())
51.1.布局按钮在右下角
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class RightBottomBtn(QWidget):
def __init__(self):
super(RightBottomBtn, self).__init__()
self.setWindowTitle("按钮右下角")
hbox = QHBoxLayout()
hbox.addStretch(1)
okBtn = QPushButton("确定")
cancelBtn = QPushButton("取消")
hbox.addWidget(okBtn)
hbox.addWidget(cancelBtn)
vbox = QVBoxLayout()
vbox.addStretch(0) #优先排列
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
btn3 = QPushButton("按钮3")
vbox.addWidget(btn1)
vbox.addWidget(btn2)
vbox.addWidget(btn3)
vbox.addStretch(1) #占余下位置
vbox.addLayout(hbox)
self.setLayout(vbox)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = RightBottomBtn()
main.show()
sys.exit(app.exec_())
52.1.控件所占相对百分比,设置为延展量0的优先排列,余下的位置.给其它非0的控件
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class StrechDemo(QWidget):
def __init__(self):
super(StrechDemo, self).__init__()
self.setWindowTitle("控件升缩量")
self.resize(800, 100)
hbox = QHBoxLayout()
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
btn3 = QPushButton("按钮3")
hbox.addStretch(1) #添加前设置
hbox.addWidget(btn1)
hbox.addStretch(2)
hbox.addWidget(btn2)
hbox.addStretch(3)
hbox.addWidget(btn3)
# hbox.addStretch(1)
# btnOK= QPushButton("确定")
# btnCancel = QPushButton("取消")
# hbox.addWidget(btnOK)
# hbox.addWidget(btnCancel)
self.setLayout(hbox)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = StrechDemo()
main.show()
sys.exit(app.exec_())
53.1.使用网格布局设置表单
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class GirdFormDemo(QWidget):
def __init__(self):
super(GirdFormDemo, self).__init__()
self.setWindowTitle("栅格布局:表单设计")
titleLable = QLabel("标题")
authorLable = QLabel("作者")
contentLabel = QLabel("内容")
titleEdit = QLineEdit()
authorEdit = QLineEdit()
contentEdit = QTextEdit()
layout = QGridLayout()
layout.addWidget(titleLable, 1, 0)
layout.addWidget(titleEdit, 1, 1)
layout.addWidget(authorLable,2, 0)
layout.addWidget(authorEdit,2, 1)
layout.addWidget(contentLabel, 3, 0)
layout.addWidget(contentEdit, 3, 1, 5, 1) #设置所在的行,列,占用的行,列数
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = GirdFormDemo()
main.show()
sys.exit(app.exec_())
54.1.控件移动边界
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class GirdFormDemo(QWidget):
def __init__(self):
super(GirdFormDemo, self).__init__()
self.setWindowTitle("拖动边界")
hbox = QHBoxLayout()
self.setGeometry(300, 300, 300, 200)
topLeft = QFrame()
topLeft.setFrameShape(QFrame.StyledPanel)
topRight = QTextEdit()
bottom = QFrame()
bottom.setFrameShape(QFrame.StyledPanel)
splitter1 = QSplitter(Qt.Horizontal) #水平可以移动边界
splitter1.addWidget(topLeft)
splitter1.addWidget(topRight)
splitter1.setSizes([100, 200]) #设置所有宽度
splitter2 = QSplitter(Qt.Vertical) #垂直移动边界
splitter2.addWidget(splitter1)
splitter2.addWidget(bottom)
hbox.addWidget(splitter2)
self.setLayout(hbox)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = GirdFormDemo()
main.show()
sys.exit(app.exec_())
55.1.自定义信号与槽的使用触发
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
sendmsg = pyqtSignal(object) #定义一个信号
def run(self): #想触发信号调用此方法
self.sendmsg.emit("Hello Tony") #触发信号,并传参
class MySolt(QObject):
def get(self, msg): #处理接收到信号
print("信息:" + msg)
if __name__ == "__main__":
sender = MyTypeSignal()
solt = MySolt()
sender.sendmsg.connect(solt.get) #信号绑定方法
sender.run() #运行
sender.sendmsg.disconnect(solt.get) #解除信号与槽的绑定
sender.run()
56.1.同一个信号,传递多个参数的重载.
from PyQt5.QtCore import *
class MutilSignal(QObject):
signal1 = pyqtSignal()
signal2 = pyqtSignal(int)
signal3 = pyqtSignal(int, str)
signal4 = pyqtSignal(list)
signal5 = pyqtSignal(dict)
signal6 = pyqtSignal([int, str], [str]) #申明一个重载版本信号,[]代表传入参数可以是int,str的.也可以只有一个的str参数类型
def __init__(self):
super(MutilSignal, self).__init__()
self.signal1.connect(self.signalCall1)
self.signal2.connect(self.signalCall2)
self.signal3.connect(self.signalCall3)
self.signal4.connect(self.signalCall4)
self.signal5.connect(self.signalCall5)
self.signal6[int, str].connect(self.signalCall6) #关联时指定
self.signal6[str].connect(self.signalCall6Overload)
# self.signal5.connect(self.signalCall5)
def signalCall1(self):
print("signal1 emit")
def signalCall2(self, val):
print("signal2 emit, value:", val)
def signalCall3(self, val, text):
print("signal3 emit, value:", val, text)
def signalCall4(self, val):
print("signal4 emit, value:", val)
def signalCall5(self, val):
print("signal5 emit, value:", val)
def signalCall6(self, val, text):
print("signal6 emit, value:", val, text)
def signalCall6Overload(self, text):
print("signal6 overload emit, value:", text)
if __name__ == "__main__":
myMutilSignal = MutilSignal()
myMutilSignal.signal1.emit()
myMutilSignal.signal2.emit(2)
myMutilSignal.signal3.emit(100, "signal3:hello world")
myMutilSignal.signal4.emit(["a", "b", "c"])
myMutilSignal.signal5.emit({"name":"tony", "age":18})
myMutilSignal.signal6[int, str].emit(1314, "signalcall6") #调用时也需要要显示指定参数类型
myMutilSignal.signal6[str].emit("overload")
57.1.使用窗口信号关闭窗口
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class WinSignal(QMainWindow):
btn_click_signal = pyqtSignal() #定义个没有参数的信号
def __init__(self):
super(WinSignal, self).__init__()
self.setWindowTitle("为窗口添加信号")
self.resize(400, 300)
btn = QPushButton("关闭窗口", self)
btn.clicked.connect(self.btn_clicked) #按钮添加槽
self.btn_click_signal.connect(self.btnClose) #信号绑定的槽
def btn_clicked(self):
self.btn_click_signal.emit() #触发信号
def btnClose(self):
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
winSignal = WinSignal()
winSignal.show()
sys.exit(app.exec_())
58.1.使用线程,不同类之间传递数据
import sys, time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class BackendThread(QThread): #定义个后台运行的线程,每1秒更新时间,并传出个时间字符串
update_time = pyqtSignal(str)
def run(self):
while True:
data = QDateTime.currentDateTime()
current_date_time = data.toString("yyyy-MM-dd hh:mm:ss")
self.update_time.emit(current_date_time)
time.sleep(1)
class ThreadUpdateUI(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setWindowTitle("多线程更新UI数据")
self.resize(400, 300)
self.input = QLineEdit(self)
self.input.resize(400, 300)
self.initUI()
def initUI(self):
self.backendThread = BackendThread()
self.backendThread.update_time.connect(self.handDisplay) #对线程的信号绑定当前类的方法.实现传递参数
self.backendThread.start()
def handDisplay(self, data): #接收信号传来的参数
self.input.setText(data)
if __name__ == "__main__":
app = QApplication(sys.argv)
winSignal = ThreadUpdateUI()
winSignal.show()
sys.exit(app.exec_())
59.1.信号与槽,通过对象名自动连接
import sys, time
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
class AutoSignalSolt(QWidget):
def __init__(self):
super(AutoSignalSolt, self).__init__()
self.okbtn = QPushButton("OK")
self.okbtn.setObjectName("okButton") #与槽的方法名有对应关每次
self.cancel_btn = QPushButton("Cancel")
self.cancel_btn.setObjectName("cancelBtn")
hbox = QHBoxLayout()
hbox.addWidget(self.okbtn)
hbox.addWidget(self.cancel_btn)
self.setLayout(hbox)
QtCore.QMetaObject.connectSlotsByName(self) #需要放在setlayout后面才触发
# self.okbtn.clicked.connect(self.on_okButton_clicked)
@QtCore.pyqtSlot()
def on_okButton_clicked(self): #槽的命名规则on_对象名_信号
print("ok btn solt")
@QtCore.pyqtSlot()
def on_cancelBtn_clicked(self):
print("cancel btn solt")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = AutoSignalSolt()
main.show()
sys.exit(app.exec_())
60.1.使用lamba表达式实现槽的多个参数传递
import sys, time
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
class LambaSoltArg(QMainWindow):
def __init__(self):
super(LambaSoltArg, self).__init__()
self.setWindowTitle("使用Lamba 表达式传递参数")
self.btn1 = QPushButton("按钮1")
self.btn2 = QPushButton("按钮2")
self.btn1.clicked.connect(lambda :self.on_btn_clicked(10, 20))
self.btn2.clicked.connect(lambda :self.on_btn_clicked(100, 200))
layout = QHBoxLayout()
layout.addWidget(self.btn1)
layout.addWidget(self.btn2)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
def on_btn_clicked(self, m, n):
print("结果为:", str(m + n))
QMessageBox.information(self, "结果为:", str(m + n))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = LambaSoltArg()
main.show()
sys.exit(app.exec_())
61.1.传递参数另外种方法
import sys, time
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from functools import partial
class LambaSoltArg(QMainWindow):
def __init__(self):
super(LambaSoltArg, self).__init__()
self.setWindowTitle("使用Lamba 表达式传递参数")
self.btn1 = QPushButton("按钮1")
self.btn2 = QPushButton("按钮2")
x = 100
y = 200
self.btn1.clicked.connect(partial(self.on_btn_clicked, 10, 20))
self.btn2.clicked.connect(partial(self.on_btn_clicked, x, y))
# self.btn1.clicked.connect(lambda :self.on_btn_clicked(10, 20))
# self.btn2.clicked.connect(lambda :self.on_btn_clicked(100, 200))
layout = QHBoxLayout()
layout.addWidget(self.btn1)
layout.addWidget(self.btn2)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
def on_btn_clicked(self, m, n):
print("结果为:", str(m + n))
QMessageBox.information(self, "结果为:", str(m + n))
if __name__ == "__main__":
app = QApplication(sys.argv)
main = LambaSoltArg()
main.show()
sys.exit(app.exec_())
62.1.调用其它窗口的控件来实现数据交互,耦合度高.不推荐
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
def __init__(self, parent=None):
super(DateDialog, self).__init__(parent)
self.setWindowTitle("DateDialog")
layout = QVBoxLayout(self)
self.datetime = QDateTimeEdit(self)
self.datetime.setCalendarPopup(True)
self.datetime.setDateTime(QDateTime.currentDateTime()) #设置时间控件的时间
layout.addWidget(self.datetime)
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
def dateTime(self):
return self.datetime.dateTime() #返回当前时间
@staticmethod
def getDateTime():
dialog = DateDialog(parent = None)
result = dialog.exec() #显示对话框
date = dialog.dateTime() #获取日期时间
return (date.date(), date.time(), result == QDialog.Accepted)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DateDialog()
print(main.dateTime())
main.show()
sys.exit(app.exec_())
63.1.不同窗口推荐使用自定义信号与槽来传递数据,尽量避免访问其它窗口控件,降低程序之间耦合度
A,B窗口,B窗口是子窗口.
把自定义信号定计在子窗口B中,可以通过自定义信号往A窗口传数据
自定义信号槽,关联在A窗口中
A窗口代码
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from newDialog import DateDialog
class MutilWindows2(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("设置多窗口交互使用信号与槽")
self.resize(400, 300)
self.lineEdit_inner = QLineEdit(self) #用来显示时间
self.lineEdit_inner.setText("接收子窗口内置信号时间")
self.lineEdit_Emit = QLineEdit(self)
self.lineEdit_Emit.setText("接收子窗口自定义信号时间")
self.openBtn = QPushButton("获取时间")
self.openBtn.clicked.connect(self.openDialog)
vbox = QVBoxLayout()
vbox.addWidget(self.lineEdit_inner)
vbox.addWidget(self.lineEdit_Emit)
vbox.addWidget(self.openBtn)
self.setLayout(vbox)
def openDialog(self):
dailog = DateDialog(self)
dailog.datetime_inner.dateTimeChanged.connect(self.deal_inner_solt) #需要访问另外窗口控件,设置其对应的槽函数
dailog.Signal_OneParameter.connect(self.deal_emit_solt) #给自定义信号关联槽
dailog.show()
def deal_inner_solt(self, date): #接收日历返回的时间
self.lineEdit_inner.setText(date.toString()) #显示在当前窗口
def deal_emit_solt(self, date):
self.lineEdit_Emit.setText(date) # 显示在当前窗口
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MutilWindows2()
main.show()
sys.exit(app.exec_())
子窗口代码
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
Signal_OneParameter = pyqtSignal(str) #自定义信号
def __init__(self, parent=None):
super(DateDialog, self).__init__(parent)
self.setWindowTitle("子窗口用来发射信号")
self.resize(100, 150)
layout = QVBoxLayout(self)
self.datetime_inner = QDateTimeEdit(self)
self.datetime_inner.setCalendarPopup(True)
self.datetime_inner.setDateTime(QDateTime.currentDateTime()) #设置时间控件的时间
self.datetime_emit = QDateTimeEdit(self)
self.datetime_emit.setCalendarPopup(True)
self.datetime_emit.setDateTime(QDateTime.currentDateTime()) # 设置时间控件的时间
self.datetime_emit.dateTimeChanged.connect(self.emit_signal) #关联槽方法
layout.addWidget(self.datetime_inner)
layout.addWidget(self.datetime_emit)
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
def emit_signal(self): #获取当前控件时间,并触发信号对应的槽函数
date_str = self.datetime_emit.dateTime().toString()
self.Signal_OneParameter.emit(date_str)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = DateDialog()
main.show()
sys.exit(app.exec_())