pyqt
QtWidgets.QLabel 标签
QtWidgets.QWidget 窗口
QApplication.processEvents()#用于刷新界面
app = QtWidgets.QApplication(sys.argv) #pyqt窗口必须在QApplication
方法中使用
sys.exit(app.exec_())
label = QtWidgets.QLabel("hello world")#创建一个标签,标签文字为hello world
windows=QtWidgets.QWidget() 创建一个窗口变量,并赋给windows
label = QtWidgets.QLabel(windows) #在窗口windows里创建一个标签
label.setText("hello world")
from PyQt5 import QtWidgets
# 从PyQt库导入QtWidget通用窗口类
class mywindow(QtWidgets.QWidget):#
# 自己建一个mywindows类,以class开头,mywindows是自己的类名,
# (QtWidgets.QWidget)是继承QtWidgets.QWidget类方法,
def __init__(self):
super(mywindow, self).__init__()
self.label=QtWidgets.QLabel(self)
self.label.setText("123")
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
windwos=mywindow()
windwos.show()
sys.exit(app.exec_())
布局:
通常从里到外进行布局,最外层一般都是栅栏布局
designer
xx.ui文件放到pyuic5.exe所在目录下,在该目录下运行pyuic5 -o ui_xx.py xx.ui
会在目录下生成一ui_xx.py文件
生成的ui_xx.py文件显示:
在文件结尾处添加代码
XXX根据生成的Ui类确定,通常为MainWindow,Widget等
if __name__=="__main__":
import sys
app=QtWidgets.QApplication(sys.argv)
widget=QtWidgets.XXX()
ui=Ui_XXX()
ui.setupUi(widget)
widget.show()
sys.exit(app.exec_())
或新建一py文件
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_ChildrenForm
class ChildrenForm(QtWidgets.QWidget, Ui_ChildrenForm):
def __init__(self):
super(ChildrenForm, self).__init__()
self.setupUi(self)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
childForm=ChildrenForm()
childForm.show()
sys.exit(app.exec_())
控件通用属性:
objectName 控件对象名称 例:quitButton= QtWidgets.QPushButton() 等号前面的那个名字,调用该控件:self.quitButton
geometry 相对坐标系
sizePolicy 控件大小策略
minimumSize最小宽度、高度
maximumSize最大宽度、高度 如果想让窗体或控件固定大小,可以将mini和max这两个属性设置成一样的数值
font 字体
cursor 光标
windowTitle 窗体标题
windowsIcon / icon 窗体图标/控件图标
iconSize 图标大小
toolTip 提示信息
statusTip 任务栏提示信息
text 控件文字
shortcut 快捷键
控件方法:
setObjectName #设置对象名称
setText #设置显示文字
setPalette #
信号槽
信号和槽是一种高级接口,应用于对象之间的通信。
所以QObject(QT的基类)类都可以使用信号槽
self.quitButton.clicked.connect(Form.close)
self.connect(quitButton,SIGNAL("clicked()"),self.openFile)
connect(object1,SIGNAL(signal),object2,SLOT(slot))
app.connect(b,SIGNAL("clicked()"),app,SLOT("quit()"))
这里,信号是self.quitButton.clicked,槽(方法)是Form.close。在QT5中,槽不在限定必须是slot,k可以是普通的函数、类的普通成员函数、lambda函数等。
实现的功能是:当按钮点击之后关闭窗体。
流程:按钮是信号发送者,当点击按钮之后会发送一个信号出去,通过这段代码程序内部的通讯机制知道这个按钮的点击事情被连接到窗体的关闭事件上去了,然后通知接受者窗体,你该运行槽函数close了!
信号的connect连接最好放在__init__析构函数里面,这样只会声明一次连接,如果在类方法(函数中)使用的话,要记得disconnect,否则connect会连接多次,导致程序异常。
信号槽函数不用加 (),否则可能会导致连接异常。
PyQt的窗体控件类已经有很多的内置信号,开发者也可以添加自己的自定义信号,信号槽有如下特点:
- 一个信号可以连接到许多插槽。
- 一个信号也可以连接到另一个信号。
- 信号参数可以是任何Python类型。
- 一个插槽可以连接到许多信号。
- 连接可能会直接(即同步)或排队(即异步)。
- 连接可能会跨线程。
- 信号可能会断开
_signal=QtCore.pyqtSignal(str)#定义信号,该信号的发射必须带有一个参数,不管连接槽还是信号
signal=QtCore.pyqtSignal()#定义信号,该信号的发射不带参数,不管连接槽还是信号
self._signal.connect(self.singal)#连接信号
self._signal.connect(self.signcall)#连接槽
self._signal.emit(xxx)
self.signal.emit()
def signcall(self):
xxx
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class SinClass(QObject):
##声明一个无参数的信号
sin1 = pyqtSignal()
##声明带一个int类型参数的信号
sin2 = pyqtSignal(int)
##声明带一个int和str类型参数的信号
sin3 = pyqtSignal(int, str)
##声明带一个列表类型参数的信号
sin4 = pyqtSignal(list)
##声明带一个字典类型参数的信号
sin5 = pyqtSignal(dict)
##声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
sin6 = pyqtSignal([int, str], [str])
def __init__(self, parent=None):
super(SinClass, self).__init__(parent)
##信号连接到指定槽
self.sin1.connect(self.sin1Call)
self.sin2.connect(self.sin2Call)
self.sin3.connect(self.sin3Call)
self.sin4.connect(self.sin4Call)
self.sin5.connect(self.sin5Call)
self.sin6[int, str].connect(self.sin6Call)
self.sin6[str].connect(self.sin6OverLoad)
##信号发射
self.sin1.emit()
self.sin2.emit(1)
self.sin3.emit(1, "text")
self.sin4.emit([1, 2, 3, 4])
self.sin5.emit({"name": "codeio", "age": "25"})
self.sin6[int, str].emit(1, "text")
self.sin6[str].emit("text")
def sin1Call(self):
print("sin1 emit")
def sin2Call(self, val):
print("sin2 emit,value:", val)
def sin3Call(self, val, text):
print("sin3 emit,value:", val, text)
def sin4Call(self, val):
print("sin4 emit,value:", val)
def sin5Call(self, val):
print("sin5 emit,value:", val)
def sin6Call(self, val, text):
print("sin6 emit,value:", val, text)
def sin6OverLoad(self, val):
print("sin6 overload emit,value:", val)
QMessageBox对话框包含类型只是图标不同其他无太大差别:
QMessageBox.information 信息框
QMessageBox.question 问答框
QMessageBox.warning 警告
QMessageBox.ctitical危险
QMessageBox.about 关于
标准输入框QInputDialog
QInputDialog.getDouble
QInputDialog.getInt
QInputDialog.getText
QInputDialog.getItem #列表框
QInputDialog.getMultiLineText #多行文本输入
标准文件打开保存框QFileDialog
单个文件打开 QFileDialog.getOpenFileName()
多个文件打开 QFileDialog.getOpenFileNames()
文件夹选取 QFileDialog.getExistingDirectory()
文件保存 QFileDialog.getSaveFileName()
QColorDialog颜色对话框
QColorDialog.getColor()
QFontDialog字体对话框
self.statusbar.showMessage('状态栏信息')#状态栏显示信息
菜单栏与工具栏一样,里面的元素都是QAction
QAction(动作)的信号槽调用: self.fileOpen.triggered.connect(self.openMsg)
菜单(QMenuBar)的信号槽调用(该菜单下的所有动作都会执行该菜单的槽,再执行动作对应的槽)
self.menuOpen.triggered.connect(self.openMsg)
#把子窗口放到主窗口
class MainForm(QtWidgets.QMainWindow, Ui_MainForm):
def __init__(self):
super(MainForm, self).__init__()
self.setupUi(self)
self.child = ChildrenForm() # self.child = children()生成子窗口实例self.child
self.actionFs.triggered.connect(self.childShow) # 点击actionTst,子窗口就会显示在主窗口的MaingridLayout中
def childShow(self):
self.MaingridLayout.addWidget(self.child) # 布局中添加子窗口
self.child.show()
.qrc是资源文件
<RCC>
<qresource>
<file>images/fileopen.png</file>
<file>images/filesave.png</file>
</qresource>
</RCC>
回车
self.lineEdit.editingFinished.connect(self.onChanged)
self.lineEdit.text()#获取lineEdit的内容
ui_xxx.py是designer生成的界面文件,通常里面只有两个方法setupUi(创建控件界面布局),retranslateUi(显示控件,布局文本)
xxx.py是界面主类,继承了ui_xxx.py文件,该类主要是对界面的按钮事件进行控制
model = QtWidgets.QFileSystemModel()
model.setRootPath('E:\ziliao\python\pyqt')
treeView.setModel(model)
分割窗口
整个对话框由3个窗口组成,各个窗口之间的大小可以随意拖动改变.此实例使用QSplitter类来实现
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class MainWidget(QMainWindow):
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
font=QFont(self.tr("黑体"),12)
QApplication.setFont(font)
mainSplitter=QSplitter(Qt.Horizontal,self)
leftText=QTextEdit(self.tr("左窗口"),mainSplitter)
leftText.setAlignment(Qt.AlignCenter)
rightSplitter=QSplitter(Qt.Vertical,mainSplitter)
rightSplitter.setOpaqueResize(False)
upText=QTextEdit(self.tr("上窗口"),rightSplitter)
upText.setAlignment(Qt.AlignCenter)
bottomText=QTextEdit(self.tr("下窗口"),rightSplitter)
bottomText.setAlignment(Qt.AlignCenter)
mainSplitter.setStretchFactor(1,1)
mainSplitter.setWindowTitle(self.tr("分割窗口"))
self.setCentralWidget(mainSplitter)
app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()
vlayout1.addStretch()#布局拉伸,里面的控件不会上下拉伸(上下)
leftLayout.setColumnStretch(1, 3)#此处设定两列的空间比为1:3。即使对话框框架大小改变了,两列之间的宽度比依然保持不变。
setAlignment(Qt.AlignCenter)#对齐方式
Qt.AlignLeft:左对齐。
Qt.AlignRight:右对齐。
Qt.AlignCenter:文字居中(Qt.AlignHCenter为水平居中,Qt.AlignVCenter为垂直居中)。
Qt.AlignUp:文字与顶端对齐。
Qt.AlignBottom:文字与底部对齐。
mainLayout.setSizeConstraint(QLayout.SetFixedSize)#对话框的尺寸保持相对固定,始终是各空间组合的默认尺寸
setFrameStyle(QFrame.Panel | QFrame.Plain)#setFrameStyle是QFrame的方法,第一项参数是形式,第二项是阴影
self.setCentralWidget(QWorkspace())#设置主窗口的中央窗体为QWorkspace对象
setStretchFactor()方法用于设定可伸缩控件,第一个参数指定设置的控件序号,控件序号按插入的先后次序从0起依次编号,第二个参数大于0的值表示此空间为可伸缩空间
mousePressEven(self,event):#重写鼠标点击事件
mouseMoveEvent(self,event):#重写鼠标移动事件
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
1.信号槽的应用
2.QFileDialog,QColorDialog,QFontDialog
3.获得窗体的各种位置信息,重定义QWidget的moveEvent()和resizeEvent()函数,分别响应对话框的移动事件和调整大小事件。
4.QInputDialog各种应用
5.QMessageBox
6.抽屉效果(QToolBox \(\to\) QGroupBox \(\to\) QToolButton )
7.表格(QTableWidget,QTableWidgetItem,QDateTimeEdit,QComboBox(下拉框),QSpinBox)
8.进度条(QProgressDialog,QProgressBar)
9.designer
10.在程序中使用Ui
11.动态加载ui
12.布局管理
QHBoxLayout,QVBoxLayout,QGridLayout,布局中最常用的方法有addWidget金额addLayout,addWidget用于在布局中插入控件,addLayout用于在布局中插入子布局
addWidget:
addWidget (self, QWidget)
addWidget (self, QWidget, int, int, Qt.Alignment alignment = 0)
addWidget (self, QWidget, int, int, int, int, Qt.Alignment alignment = 0)
QWidget参数为需插入的控件对象,后面的两个int参数为插入的行和列,再后面两上int参数为跨度的行数和跨度的列数,alignment参数描述各控件的对齐方式
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class LayoutDialog(QDialog):
def __init__(self,parent=None):
super(LayoutDialog,self).__init__(parent)
self.setWindowTitle(self.tr("用户信息"))
label1=QLabel(self.tr("用户名:"))
label2=QLabel(self.tr("姓名:"))
label3=QLabel(self.tr("性别:"))
label4=QLabel(self.tr("部门:"))
label5=QLabel(self.tr("年龄:"))
otherLabel=QLabel(self.tr("备注:"))
otherLabel.setFrameStyle(QFrame.Panel|QFrame.Sunken)
userLineEdit=QLineEdit()
nameLineEdit=QLineEdit()
sexComboBox=QComboBox()
sexComboBox.insertItem(0,self.tr("男"))
sexComboBox.insertItem(1,self.tr("女"))
departmentTextEdit=QTextEdit()
ageLineEdit=QLineEdit()
labelCol=0
contentCol=1
leftLayout=QGridLayout()
leftLayout.addWidget(label1,0,labelCol)
leftLayout.addWidget(userLineEdit,0,contentCol)
leftLayout.addWidget(label2,1,labelCol)
leftLayout.addWidget(nameLineEdit,1,contentCol)
leftLayout.addWidget(label3,2,labelCol)
leftLayout.addWidget(sexComboBox,2,contentCol)
leftLayout.addWidget(label4,3,labelCol)
leftLayout.addWidget(departmentTextEdit,3,contentCol)
leftLayout.addWidget(label5,4,labelCol)
leftLayout.addWidget(ageLineEdit,4,contentCol)
leftLayout.addWidget(otherLabel,5,labelCol,1,2)
leftLayout.setColumnStretch(0,1)
leftLayout.setColumnStretch(1,3)
label6=QLabel(self.tr("头像:"))
iconLabel=QLabel()
icon=QPixmap("image/2.jpg")
iconLabel.setPixmap(icon)
iconLabel.resize(icon.width(),icon.height())
iconPushButton=QPushButton(self.tr("改变"))
hLayout=QHBoxLayout()
hLayout.setSpacing(20)
hLayout.addWidget(label6)
hLayout.addWidget(iconLabel)
hLayout.addWidget(iconPushButton)
label7=QLabel(self.tr("个人说明:"))
descTextEdit=QTextEdit()
rightLayout=QVBoxLayout()
rightLayout.setMargin(10)
rightLayout.addLayout(hLayout)
rightLayout.addWidget(label7)
rightLayout.addWidget(descTextEdit)
OKPushButton=QPushButton(self.tr("确定"))
cancelPushButton=QPushButton(self.tr("取消"))
bottomLayout=QHBoxLayout()
bottomLayout.addStretch()
bottomLayout.addWidget(OKPushButton)
bottomLayout.addWidget(cancelPushButton)
mainLayout=QGridLayout(self)
mainLayout.setMargin(15)
mainLayout.setSpacing(10)
mainLayout.addLayout(leftLayout,0,0)
mainLayout.addLayout(rightLayout,0,1)
mainLayout.addLayout(bottomLayout,1,0,1,2)
mainLayout.setSizeConstraint(QLayout.SetFixedSize)
app=QApplication(sys.argv)
dialog=LayoutDialog()
dialog.show()
app.exec_()
13.多文档窗口(QWorkspace里添加QMainWindow)
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class MainWidget(QMainWindow):
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
self.setWindowTitle(self.tr("多文档窗口"))
self.workSpace=QWorkspace()
self.setCentralWidget(self.workSpace)
window1=QMainWindow()
window1.setWindowTitle(self.tr("窗口1"))
edit1=QTextEdit(self.tr("子窗口1"))
window1.setCentralWidget(edit1)
window2=QMainWindow()
window2.setWindowTitle(self.tr("窗口2"))
edit2=QTextEdit(self.tr("子窗口2"))
window2.setCentralWidget(edit2)
window3=QMainWindow()
window3.setWindowTitle(self.tr("窗口3"))
edit3=QTextEdit(self.tr("子窗口3"))
window3.setCentralWidget(edit3)
self.workSpace.addWindow(window1)
self.workSpace.addWindow(window2)
self.workSpace.addWindow(window3)
self.createMenu()
self.slotScroll()
def createMenu(self):
layoutMenu=self.menuBar().addMenu(self.tr("布局"))
arrange=QAction(self.tr("排列图标"),self)
self.connect(arrange,SIGNAL("triggered()"),self.workSpace,SLOT("arrangeIcons()"))
layoutMenu.addAction(arrange)
tile=QAction(self.tr("平铺"),self)
self.connect(tile,SIGNAL("triggered()"),self.workSpace,SLOT("tile()"))
layoutMenu.addAction(tile)
cascade=QAction(self.tr("层叠"),self)
self.connect(cascade,SIGNAL("triggered()"),self.workSpace,SLOT("cascade()"))
layoutMenu.addAction(cascade)
otherMenu=self.menuBar().addMenu(self.tr("其它"))
scrollAct=QAction(self.tr("滚动"),self)
self.connect(scrollAct,SIGNAL("triggered()"),self.slotScroll)
otherMenu.addAction(scrollAct)
otherMenu.addSeparator()
nextAct=QAction(self.tr("下一个"),self)
self.connect(nextAct,SIGNAL("triggered()"),self.workSpace,SLOT("activateNextWindow()"))
otherMenu.addAction(nextAct)
previousAct=QAction(self.tr("上一个"),self)
self.connect(previousAct,SIGNAL("triggered()"),self.workSpace,SLOT("activatePreviousWindow()"))
otherMenu.addAction(previousAct)
def slotScroll(self):
self.workSpace.setScrollBarsEnabled(not self.workSpace.scrollBarsEnabled())
app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()
14.分割窗口(QSplitter)
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class MainWidget(QMainWindow):
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
font=QFont(self.tr("黑体"),12)
QApplication.setFont(font)
mainSplitter=QSplitter(Qt.Horizontal,self)
leftText=QTextEdit(self.tr("左窗口"),mainSplitter)
leftText.setAlignment(Qt.AlignCenter)
rightSplitter=QSplitter(Qt.Vertical,mainSplitter)
rightSplitter.setOpaqueResize(False)
upText=QTextEdit(self.tr("上窗口"),rightSplitter)
upText.setAlignment(Qt.AlignCenter)
bottomText=QTextEdit(self.tr("下窗口"),rightSplitter)
bottomText.setAlignment(Qt.AlignCenter)
mainSplitter.setStretchFactor(1,1)
mainSplitter.setWindowTitle(self.tr("分割窗口"))
self.setCentralWidget(mainSplitter)
app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()
15.停靠,悬浮窗口(QDockWidget(自带分割))
设置停靠窗口的一般流程为:
1)创建一个QDockWidget对象的停靠窗体。
2)设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两个方法。
3)新建一个要插入停靠窗体的控件,本实例中为QTextEdit,也可为其他控件,常用的一般为QListWidget和QTextEdit。
4)把控件插入停靠窗体,调用QDockWidget的setWidget()方法。
5)使用addDockWidget()方法在MainWindow中加入此停靠窗体。
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class MainWidget(QMainWindow):
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
self.setWindowTitle(self.tr("依靠窗口"))
te=QTextEdit(self.tr("主窗口"))
te.setAlignment(Qt.AlignCenter)
self.setCentralWidget(te)
#停靠窗口1
dock1=QDockWidget(self.tr("停靠窗口1"),self)
dock1.setFeatures(QDockWidget.DockWidgetMovable)
dock1.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
te1=QTextEdit(self.tr("窗口1,可在Main Window的左部和右部停靠,不可浮动,不可关闭"))
dock1.setWidget(te1)
self.addDockWidget(Qt.RightDockWidgetArea,dock1)
#停靠窗口2
dock2=QDockWidget(self.tr("停靠窗口2"),self)
dock2.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetClosable)
te2=QTextEdit(self.tr("窗口2,只可浮动"))
dock2.setWidget(te2)
self.addDockWidget(Qt.RightDockWidgetArea,dock2)
#停靠窗口3
dock3=QDockWidget(self.tr("停靠窗口3"),self)
dock3.setFeatures(QDockWidget.AllDockWidgetFeatures)
te3=QTextEdit(self.tr("窗口3,可在Main Window任意位置停靠,可浮动,可关闭"))
dock3.setWidget(te3)
self.addDockWidget(Qt.BottomDockWidgetArea,dock3)
app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()
17.综合布局实例
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class StockDialog(QDialog):
def __init__(self,parent=None):
super(StockDialog,self).__init__(parent)
self.setWindowTitle(self.tr("综合布局实例"))
mainSplitter=QSplitter(Qt.Horizontal)
mainSplitter.setOpaqueResize(True)
listWidget=QListWidget(mainSplitter)
listWidget.insertItem(0,self.tr("个人基本资料"))
listWidget.insertItem(1,self.tr("联系方式"))
listWidget.insertItem(2,self.tr("详细信息"))
frame=QFrame(mainSplitter)
stack=QStackedWidget()
stack.setFrameStyle(QFrame.Panel|QFrame.Raised)
baseInfo=BaseInfo()
contact=Contact()
detail=Detail()
stack.addWidget(baseInfo)
stack.addWidget(contact)
stack.addWidget(detail)
amendPushButton=QPushButton(self.tr("修改"))
closePushButton=QPushButton(self.tr("关闭"))
buttonLayout=QHBoxLayout()
buttonLayout.addStretch(1)
buttonLayout.addWidget(amendPushButton)
buttonLayout.addWidget(closePushButton)
mainLayout=QVBoxLayout(frame)
mainLayout.setMargin(10)
mainLayout.setSpacing(6)
mainLayout.addWidget(stack)
mainLayout.addLayout(buttonLayout)
self.connect(listWidget,SIGNAL("currentRowChanged(int)"),stack,SLOT("setCurrentIndex(int)"))
self.connect(closePushButton,SIGNAL("clicked()"),self,SLOT("close()"))
layout=QHBoxLayout(self)
layout.addWidget(mainSplitter)
self.setLayout(layout)
class BaseInfo(QWidget):
def __init__(self,parent=None):
super(BaseInfo,self).__init__(parent)
label1=QLabel(self.tr("用户名:"))
label2=QLabel(self.tr("姓名:"))
label3=QLabel(self.tr("性别:"))
label4=QLabel(self.tr("部门:"))
label5=QLabel(self.tr("年龄:"))
otherLabel=QLabel(self.tr("备注:"))
otherLabel.setFrameStyle(QFrame.Panel|QFrame.Sunken)
userLineEdit=QLineEdit()
nameLineEdit=QLineEdit()
sexComboBox=QComboBox()
sexComboBox.insertItem(0,self.tr("男"))
sexComboBox.insertItem(1,self.tr("女"))
departmentTextEdit=QTextEdit()
ageLineEdit=QLineEdit()
labelCol=0
contentCol=1
leftLayout=QGridLayout()
leftLayout.addWidget(label1,0,labelCol)
leftLayout.addWidget(userLineEdit,0,contentCol)
leftLayout.addWidget(label2,1,labelCol)
leftLayout.addWidget(nameLineEdit,1,contentCol)
leftLayout.addWidget(label3,2,labelCol)
leftLayout.addWidget(sexComboBox,2,contentCol)
leftLayout.addWidget(label4,3,labelCol)
leftLayout.addWidget(departmentTextEdit,3,contentCol)
leftLayout.addWidget(label5,4,labelCol)
leftLayout.addWidget(ageLineEdit,4,contentCol)
leftLayout.addWidget(otherLabel,5,labelCol,1,2)
leftLayout.setColumnStretch(0,1)
leftLayout.setColumnStretch(1,3)
label6=QLabel(self.tr("头像:"))
iconLabel=QLabel()
icon=QPixmap("image/2.jpg")
iconLabel.setPixmap(icon)
iconLabel.resize(icon.width(),icon.height())
iconPushButton=QPushButton(self.tr("改变"))
hLayout=QHBoxLayout()
hLayout.setSpacing(20)
hLayout.addWidget(label6)
hLayout.addWidget(iconLabel)
hLayout.addWidget(iconPushButton)
label7=QLabel(self.tr("个人说明:"))
descTextEdit=QTextEdit()
rightLayout=QVBoxLayout()
rightLayout.setMargin(10)
rightLayout.addLayout(hLayout)
rightLayout.addWidget(label7)
rightLayout.addWidget(descTextEdit)
mainLayout=QGridLayout(self)
mainLayout.setMargin(15)
mainLayout.setSpacing(10)
mainLayout.addLayout(leftLayout,0,0)
mainLayout.addLayout(rightLayout,0,1)
mainLayout.setSizeConstraint(QLayout.SetFixedSize)
class Contact(QWidget):
def __init__(self,parent=None):
super(Contact,self).__init__(parent)
label1=QLabel(self.tr("电子邮件:"))
label2=QLabel(self.tr("联系地址:"))
label3=QLabel(self.tr("邮政编码:"))
label4=QLabel(self.tr("移动电话:"))
label5=QLabel(self.tr("办公电话:"))
mailLineEdit=QLineEdit()
addressLineEdit=QLineEdit()
codeLineEdit=QLineEdit()
mpLineEdit=QLineEdit()
phoneLineEdit=QLineEdit()
receiveCheckBox=QCheckBox(self.tr("接收留言"))
layout=QGridLayout(self)
layout.addWidget(label1,0,0)
layout.addWidget(mailLineEdit,0,1)
layout.addWidget(label2,1,0)
layout.addWidget(addressLineEdit,1,1)
layout.addWidget(label3,2,0)
layout.addWidget(codeLineEdit,2,1)
layout.addWidget(label4,3,0)
layout.addWidget(mpLineEdit,3,1)
layout.addWidget(receiveCheckBox,3,2)
layout.addWidget(label5,4,0)
layout.addWidget(phoneLineEdit,4,1)
class Detail(QWidget):
def __init__(self,parent=None):
super(Detail,self).__init__(parent)
label1=QLabel(self.tr("国家/地区:"))
label2=QLabel(self.tr("省份:"))
label3=QLabel(self.tr("城市:"))
label4=QLabel(self.tr("个人说明:"))
countryComboBox=QComboBox()
countryComboBox.addItem(self.tr("中华人民共和国"))
countryComboBox.addItem(self.tr("香港"))
countryComboBox.addItem(self.tr("台北"))
countryComboBox.addItem(self.tr("澳门"))
provinceComboBox=QComboBox()
provinceComboBox.addItem(self.tr("安徽省"))
provinceComboBox.addItem(self.tr("北京市"))
provinceComboBox.addItem(self.tr("江苏省"))
cityLineEdit=QLineEdit()
remarkTextEdit=QTextEdit()
layout=QGridLayout(self)
layout.addWidget(label1,0,0)
layout.addWidget(countryComboBox,0,1)
layout.addWidget(label2,1,0)
layout.addWidget(provinceComboBox,1,1)
layout.addWidget(label3,2,0)
layout.addWidget(cityLineEdit,2,1)
layout.addWidget(label4,3,0)
layout.addWidget(remarkTextEdit,3,1)
app=QApplication(sys.argv)
main=StockDialog()
main.show()
app.exec_()
18.可拓展对话框(QWidget隐藏与显示)
19.改变控件颜色(QPalette)
20.窗体渐变效果
21.不规则窗体
22.电子钟(QLCDNumber)
23.程序启动画面
24.基本QMainWindow主窗口程序
25.
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
#import qrc_resource
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("QMainWindow")
self.text = QTextEdit()
self.setCentralWidget(self.text)
self.createActions()
self.createMenus()
self.createToolBars()
def createActions(self):
self.fileOpenAction = QAction(QIcon(":/fileopen.png"), self.tr("打开"), self)
self.fileOpenAction.setShortcut("Ctrl+O")
self.fileOpenAction.setStatusTip(self.tr("打开一个文件"))
self.connect(self.fileOpenAction, SIGNAL("triggered()"), self.slotOpenFile)
self.fileNewAction = QAction(QIcon(":/filenew.png"), self.tr("新建"), self)
self.fileNewAction.setShortcut("Ctrl+N")
self.fileNewAction.setStatusTip(self.tr("新建一个文件"))
self.connect(self.fileNewAction, SIGNAL("triggered()"), self.slotNewFile)
self.fileSaveAction = QAction(QIcon(":/filesave.png"), self.tr("保存"), self)
self.fileSaveAction.setShortcut("Ctrl+S")
self.fileSaveAction.setStatusTip(self.tr("保存文件"))
self.connect(self.fileSaveAction, SIGNAL("triggered()"), self.slotSaveFile)
self.exitAction = QAction(QIcon(":/filequit.png"), self.tr("退出"), self)
self.exitAction.setShortcut("Ctrl+Q")
self.setStatusTip(self.tr("退出"))
self.connect(self.exitAction, SIGNAL("triggered()"), self.close)
self.cutAction = QAction(QIcon(":/editcut.png"), self.tr("剪切"), self)
self.cutAction.setShortcut("Ctrl+X")
self.cutAction.setStatusTip(self.tr("剪切到粘贴板"))
self.connect(self.cutAction, SIGNAL("triggered()"), self.text.cut)
self.copyAction = QAction(QIcon(":/editcopy.png"), self.tr("复制"), self)
self.copyAction.setShortcut("Ctrl+C")
self.copyAction.setStatusTip(self.tr("复制到粘贴板"))
self.connect(self.copyAction, SIGNAL("triggered()"), self.text.copy)
self.pasteAction = QAction(QIcon(":/editpaste.png"), self.tr("粘贴"), self)
self.pasteAction.setShortcut("Ctrl+V")
self.pasteAction.setStatusTip(self.tr("粘贴内容到当前处"))
self.connect(self.pasteAction, SIGNAL("triggered()"), self.text.paste)
self.aboutAction = QAction(self.tr("关于"), self)
self.connect(self.aboutAction, SIGNAL("triggered()"), self.slotAbout)
def createMenus(self):
fileMenu = self.menuBar().addMenu(self.tr("文件"))
fileMenu.addAction(self.fileNewAction)
fileMenu.addAction(self.fileOpenAction)
fileMenu.addAction(self.fileSaveAction)
fileMenu.addAction(self.exitAction)
editMenu = self.menuBar().addMenu(self.tr("编辑"))
editMenu.addAction(self.copyAction)
editMenu.addAction(self.cutAction)
editMenu.addAction(self.pasteAction)
aboutMenu = self.menuBar().addMenu(self.tr("帮助"))
aboutMenu.addAction(self.aboutAction)
def createToolBars(self):
fileToolBar = self.addToolBar("File")
fileToolBar.addAction(self.fileNewAction)
fileToolBar.addAction(self.fileOpenAction)
fileToolBar.addAction(self.fileSaveAction)
editTool = self.addToolBar("Edit")
editTool.addAction(self.copyAction)
editTool.addAction(self.cutAction)
editTool.addAction(self.pasteAction)
def slotNewFile(self):
newWin = MainWindow()
newWin.show()
def slotOpenFile(self):
fileName = QFileDialog.getOpenFileName(self)
if fileName.isEmpty() == False:
if self.text.document().isEmpty():
self.loadFile(fileName)
else:
newWin = MainWindow()
newWin.show()
newWin.loadFile(fileName)
def loadFile(self, fileName):
file = QFile(fileName)
if file.open(QIODevice.ReadOnly | QIODevice.Text):
textStream = QTextStream(file)
while textStream.atEnd() == False:
self.text.append(textStream.readLine())
def slotSaveFile(self):
pass
def slotAbout(self):
QMessageBox.about("about me", self.tr("这是我们的第一个例子"))
app = QApplication(sys.argv)
main = MainWindow()
main.show()
app.exec_()
25.打印文本(QPrintDialog)
26.打印图片
复选框
cb = QCheckBox("显示标题",self)
cb.toggle()#设置复选框默认为选中
cb.stateChanged.conncet()
QTreeView+QStandardItemModel
from PyQt5 import (QtCore,QtGui,QtWidgets)
import os,sys
class TreeView(QtWidgets.QTreeView):
def __init__(self,folder,file,parent=None):
super(TreeView,self).__init__(parent)
self.itemModel = QtGui.QStandardItemModel()
self.itemModel.setHorizontalHeaderItem(0,QtGui.QStandardItem('目录信息'))
self.setModel(self.itemModel)
for i,line in enumerate(folder):
item = QtGui.QStandardItem(line)
item.setIcon(QtGui.QIcon("../images/dir.png"))
self.itemModel.setItem(i,0,item)
for j,line in enumerate(file):
item = QtGui.QStandardItem(line)
self.itemModel.setItem(j+i, 0, item)
item.setCheckable(True)
item.setIcon(QtGui.QIcon("../images/file.png"))
def getListFiles(path):
for root, dirs, files in os.walk(path):
return [dirs,files]
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
dirs,files=getListFiles('D:\\Projects\\离线处理软件')
window = TreeView(dirs,files)
window.show()
# window.resize(960, 240)
sys.exit(app.exec_())
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
student_tableview = QtGui.QTableView()
student_tableview.setGeometry(300, 300, 650, 230)
# 设置列宽不可变动,即不能通过鼠标拖动增加列宽
student_tableview.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Fixed)
student_tableview.horizontalHeader().setResizeMode(1, QtGui.QHeaderView.Fixed)
student_tableview.horizontalHeader().setResizeMode(2, QtGui.QHeaderView.Fixed)
student_tableview.horizontalHeader().setResizeMode(3, QtGui.QHeaderView.Fixed)
student_tableview.horizontalHeader().setResizeMode(4, QtGui.QHeaderView.Fixed)
# 设置表格的各列的宽度值
student_tableview.setColumnWidth(0, 100)
student_tableview.setColumnWidth(1, 100)
student_tableview.setColumnWidth(2, 100)
student_tableview.setColumnWidth(3, 100)
student_tableview.setColumnWidth(4, 100)
# 默认显示行头,如果你觉得不美观的话,我们可以将隐藏
student_tableview.verticalHeader().hide()
# 设置选中时为整行选中
student_tableview.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
# 设置表格的单元为只读属性,即不能编辑
student_tableview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
# 如果你用在QTableView中使用右键菜单,需启用该属性
student_tableview.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
# 准备数据模型
student_model = QtGui.QStandardItemModel()
student_model.setHorizontalHeaderItem(0, QtGui.QStandardItem("Name"))
student_model.setHorizontalHeaderItem(1, QtGui.QStandardItem("NO."))
student_model.setHorizontalHeaderItem(2, QtGui.QStandardItem("Sex"))
student_model.setHorizontalHeaderItem(3, QtGui.QStandardItem("Age"))
student_model.setHorizontalHeaderItem(4, QtGui.QStandardItem("College"))
# 在表格中添加行时,我们只需要在model中插入数据即可,一旦model中的数据发生变化,QTabelView显示就会做相应的变动
# 在第一行添加学生张三的个人信息(setItem函数的第一个参数表示行号,第二个表示列号,第三个为要显示的数据)
student_model.setItem(0, 0, QtGui.QStandardItem("张三"))
student_model.setItem(0, 1, QtGui.QStandardItem("20120202"))
student_model.setItem(0, 2, QtGui.QStandardItem("男"))
student_model.setItem(0, 3, QtGui.QStandardItem("18"))
student_model.setItem(0, 4, QtGui.QStandardItem("土木学院"))
student_model.setItem(1, 0, QtGui.QStandardItem("李四"))
student_model.setItem(1, 1, QtGui.QStandardItem("20120202"))
student_model.setItem(1, 2, QtGui.QStandardItem("男"))
student_model.setItem(1, 3, QtGui.QStandardItem("19"))
student_model.setItem(1, 4, QtGui.QStandardItem("计算机学院"))
student_model.setItem(2, 0, QtGui.QStandardItem("王五"))
student_model.setItem(2, 1, QtGui.QStandardItem("20120202"))
student_model.setItem(2, 2, QtGui.QStandardItem("男"))
student_model.setItem(2, 3, QtGui.QStandardItem("28"))
student_model.setItem(2, 4, QtGui.QStandardItem("软件学院"))
student_model.setItem(3, 0, QtGui.QStandardItem("赵七"))
student_model.setItem(3, 1, QtGui.QStandardItem("20120202"))
student_model.setItem(3, 2, QtGui.QStandardItem("男"))
student_model.setItem(3, 3, QtGui.QStandardItem("38"))
student_model.setItem(3, 4, QtGui.QStandardItem("成人教育学院"))
# 设置单元格文本居中,张三的数据设置为居中显示
# student_model.item(0, 0).setTextAlignment(QtCore.Qt.AlignCenter)
# student_model.item(0, 1).setTextAlignment(QtCore.Qt.AlignCenter)
# student_model.item(0, 2).setTextAlignment(QtCore.Qt.AlignCenter)
# student_model.item(0, 3).setTextAlignment(QtCore.Qt.AlignCenter)
# student_model.item(0, 4).setTextAlignment(QtCore.Qt.AlignCenter)
# 设置单元格文本颜色,张三的数据设置为红色
student_model.item(0, 0).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))
student_model.item(0, 1).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))
student_model.item(0, 2).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))
student_model.item(0, 3).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))
student_model.item(0, 4).setForeground(QtGui.QBrush(QtGui.QColor(255, 0, 0)))
# 将字体加粗
student_model.item(0, 0).setFont(QtGui.QFont("Times", 10, QtGui.QFont.Black))
student_model.item(0, 1).setFont(QtGui.QFont("Times", 10, QtGui.QFont.Black))
student_model.item(0, 2).setFont(QtGui.QFont("Times", 10, QtGui.QFont.Black))
student_model.item(0, 3).setFont(QtGui.QFont("Times", 10, QtGui.QFont.Black))
student_model.item(0, 4).setFont(QtGui.QFont("Times", 10, QtGui.QFont.Black))
# 设置排序方式,按年龄降序显示
student_model.sort(3, QtCore.Qt.DescendingOrder)
# 利用setModel()方法将数据模型与QTableView绑定
student_tableview.setModel(student_model)
student_tableview.show()
sys.exit(app.exec_())
self.itemModel.item(0)# PyQt5.QtGui.QStandardItem at 0x7b79120
self.itemModel.data(self.currentIndex())#当前索引对应的数据
self.itemModel.item(0).data(0)
self.currentIndex().data()
self.currentIndex().row()
self.itemModel.item(9).checkState()#Check的状态
self.itemModel.item(9).isCheckable()#是否有勾选框
self.itemModel.item(0)# PyQt5.QtGui.QStandardItem at 0x7b79120
self.itemModel.data(self.currentIndex())#当前索引对应的数据
self.itemModel.item(0).data(0)
self.currentIndex().data()
self.currentIndex().row()
self.itemModel.item(9).checkState()#Check的状态
self.itemModel.item(9).isCheckable()#是否有勾选框
if event.mimeData().hasUrls():
fileName=event.mimeData().urls()[0].toLocalFile()
NavigationToolbar(lineFig,self.parent.dispWindow.tabDispWidget)#工具栏
MyCanvas(parent = QWidget)#把绘制的图片放在QWidget上
QLabel(QWidget)#在Qwidget上绘制一标签
PyQt5
QAbstractItemView.py是一些方法,如双击,回车事件等..其中一些是可以直接用的,一些则是需使用者重写的
keyPressEvent#键盘按钮事件,需重写该方法
如:
#该方法重写了keyPressEvent,首先判断所按键是否是回车,是的话才执行
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Return:
self.treedoubleClickedEvent()
#self是Containers
#重写paintEvent方法
def paintEvent(self, event):
palette1 = QtGui.QPalette()
palette1.setColor(self.backgroundRole(), QColor(192, 253, 123)) # 设置背景颜色
palette1.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap('image/user-table.png'))) # 设置背景图片
self.setPalette(palette1)
···
绘制单张图片,大小为256x256
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(Qt.NoPen)
painter.drawPixmap(0, 0, 256, 256, QPixmap("1.png"))
painter.end()
···
#重写某个控件的鼠标按压事件
class MyWindow(QtWidgets.QWidget):
def setConnect(self):
self.spectrumDispWindow.mousePressEvent=self.spectrumDispWindowMousePressEvent
def spectrumDispWindowMousePressEvent(self,event):
print('Cligdsck')
#自定义信号
class MyWindow(QtWidgets.QWidget):
mysignal = QtCore.pyqtSignal(int, int)#定义信号
def __init__(self, parent=None):
self.mysignal.connect(self.whoIsBig)#信号与槽连接
self.mysignal.emit(10,20)#调用
def whoIsBig(self,x,y):
return x if x>y else y
self.movingAverageWidget= QWidgets()
LABEL=QLabel(self.movingAverageWidget)#创建一个label,label在widget哩
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5 import QtWidgets
class mywindow(QtWidgets.QWidget):
# 自己建一个mywindows类,以class开头,mywindows是自己的类名,
# (QtWidgets.QWidget)是继承QtWidgets.QWidget类方法,
def __init__(self):
super(mywindow, self).__init__()
self.label=QtWidgets.QLabel(self)
self.label.setText("123")
self.pushButton=QtWidgets.QPushButton(self)
self.menu=QtWidgets.QMenu(self)
self.menu.addSection("s")
action = QtWidgets.QAction(u"ds",self)
action1 = QtWidgets.QAction(u"dsdsadsads",self)
self.menu.addAction(action)
self.menu.addAction(action1)
self.menu.addMenu(self.menu)
self.pushButton.setMenu(self.menu)
self.pushButton.menu()
# self.pushButton.showMenu()
self.pushButton.setText(u"测试")
self.pushButton.setStyleSheet("QPushButton::menu-indicator{image:none;}")
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
windwos=mywindow()
windwos.show()
app.exec_()
action.triggered.connect()#Action
#添加右键菜单
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class mywindow(QWidget):
# 自己建一个mywindows类,以class开头,mywindows是自己的类名,
# (QtWidgets.QWidget)是继承QtWidgets.QWidget类方法,
def __init__(self):
super(mywindow, self).__init__()
self.label=QLabel(self)
self.label.setText("123")
self.pushButton=QPushButton(self)
self.menu=QMenu(self)
self.menu.addSection("s")
action = QAction(u"ds",self)
action1 = QAction(u"dsdsadsads",self)
self.menu.addAction(action)
self.menu.addAction(action1)
self.menu.addMenu(self.menu)
self.pushButton.setMenu(self.menu)
self.pushButton.menu()
self.pushButton.setText(u"测试")
self.pushButton.setStyleSheet("QPushButton::menu-indicator{image:none;}")
self.pushButton.setContextMenuPolicy(Qt.CustomContextMenu)
self.pushButton.customContextMenuRequested[QPoint].connect(self.rightMenuShow)
def rightMenuShow(self):
rightMenu = QMenu(self.pushButton)
removeAction = QAction(u"删除", self,
triggered=self.close) # triggered 为右键菜单点击后的激活事件。这里slef.close调用的是系统自带的关闭事件。
rightMenu.addAction(removeAction)
addAction = QAction(u"添加", self, triggered=self.close) # 也可以指定自定义对象事件
rightMenu.addAction(addAction)
rightMenu.exec_(QCursor.pos())
if __name__=='__main__':
import sys
app = QApplication(sys.argv)
windwos=mywindow()
windwos.show()
app.exec_()
button.setContextMenuPolicy(Qt.ActionsContextMenu)
tsAction=QAction(self)
tsAction.setText('12')
重写控件的键盘时间。需要setFocusPolicy(Qt.ClickFocus)
button.setFocusPolicy() #设置焦点样式 样式有:Qt.NoFocus: 无焦点,Qt.TabFocus:用tab切换焦点,Qt.ClickFocus:点击切换焦点,Qt.StrongFocus:貌似跟click一样 Qt.WheelFocus
button.setCheckable(True) #设置为开关按钮 toggle 就是按下按钮不会弹起
button.isChecked() 返回bool值 只有setCheckable()为true时有效
button.setShortcut('Ctrl+F') #设置快捷方式
self.valueEdit.setText(u'1')
self.valueEdit.setValidator(QIntValidator (0,100000000))
画线
painter=QPainter()
painter.begin(self)
painter.drawLine(x1,y1,x2,y2)
#鼠标,单击双击
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class SingleDoubleClicked(QWidget):
def __init__(self):
super(SingleDoubleClicked,self).__init__()
self.createWidget()
def createWidget(self):
self.listView=QListWidget(self)
self.listView.addItem(u's')
self.listView.mousePressEvent=self.mousePressEvent
self.listView.mouseDoubleClickEvent=self.mouseDoubleClickEvent
self.timer = QTimer()
self.timer.timeout.connect(self.singleClickEvent)
def mousePressEvent(self, e):
self.timer.start(300)
def singleClickEvent(self):
self.timer.stop()
print('1')
def mouseDoubleClickEvent(self,e):
self.timer.stop()
print('2')
if __name__=='__main__':
import sys
app = QApplication(sys.argv)
main = SingleDoubleClicked()
main.show()
app.exec_()
#多个dockWidget,tabifyDockWidget,addDockWidget。先addDockWidget,再tabifyDockWidget
class MapDockWidgets(QMainWindow):
def __init__(self,parent = None):
super(MapDockWidgets,self).__init__()
self.parent = parent
self.createWidget()
self.setWidget()
def createWidget(self):
self.tsDockWidget = QDockWidget(self.tr('时间序列图'),self)
self.diameterBarDockWidget = QDockWidget(self.tr('粒径分布图'),self)
self.diameter3dDockWidget = QDockWidget(self.tr('粒径三维图'),self)
def setWidget(self):
self.tsDockWidget.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetMovable)
self.tsDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas)
self.diameterBarDockWidget.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetMovable)
self.diameterBarDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas)
self.diameter3dDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas)
self.diameter3dDockWidget.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetMovable)
self.addDockWidget(Qt.BottomDockWidgetArea, self.tsDockWidget)
self.tabifyDockWidget(self.tsDockWidget,self.diameterBarDockWidget)
self.tabifyDockWidget(self.tsDockWidget,self.diameter3dDockWidget)
窗口弹出
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class FirstWindow(QWidget):
close_signal = pyqtSignal()
def __init__(self, parent=None):
# super这个用法是调用父类的构造函数
# parent=None表示默认没有父Widget,如果指定父亲Widget,则调用之
super(FirstWindow, self).__init__(parent)
self.resize(100, 100)
self.btn = QToolButton(self)
self.btn.setText("click")
def closeEvent(self, event):
self.close_signal.emit()
self.close()
class SecondWindow(QWidget):
def __init__(self, parent=None):
super(SecondWindow, self).__init__(parent)
self.resize(200, 200)
self.setStyleSheet("background: black")
def handle_click(self):
if not self.isVisible():
self.show()
def handle_close(self):
self.close()
if __name__ == "__main__":
App = QApplication(sys.argv)
ex = FirstWindow()
s = SecondWindow()
ex.btn.clicked.connect(s.handle_click)
# ex.btn.clicked.connect(ex.hide)
ex.close_signal.connect(ex.close)
ex.show()
sys.exit(App.exec_())
进度条
在主线程里创建一进度条框
self.progressDialog=QProgressDialog()
利用定时器,定时更新进度条值
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateProgressBar)
self.timer.start(100)
movetoThread
from PyQt5 import QtCore,QtWidgets
import sys
class Worker(QtCore.QObject):
step = QtCore.pyqtSignal(int)
def __init__(self,timevalue):
super(Worker,self).__init__()
self.timeValue = timevalue
def doWork(self):
for i in range(100):
QtCore.QThread.msleep(self.timeValue)
self.step.emit(i)
class TsQThread(QtWidgets.QDialog):
def __init__(self):
super(TsQThread,self).__init__()
self.createWidget()
self.workerThread = QtCore.QThread()
self.workerThread2 = QtCore.QThread()
self.worker = Worker(100)
self.worker.moveToThread( self.workerThread)
self.worker2 = Worker(200)
self.worker2.moveToThread(self.workerThread2)
self.button.clicked.connect(self.worker.doWork)
self.worker.step.connect(self.handleStep)
self.button.clicked.connect(self.worker2.doWork)
self.worker2.step.connect(self.handleStep2)
self.workerThread.start()
self.workerThread2.start()
def handleStep(self,value):
self.progressBar.setValue(value)
def handleStep2(self,value):
self.progressBar2.setValue(value)
def createWidget(self):
# self.subThread = QtThread()
self.button=QtWidgets.QToolButton(self)
self.progressBar = QtWidgets.QProgressBar(self)
hlayout=QtWidgets.QHBoxLayout()
hlayout.addWidget(self.button)
hlayout.addWidget(self.progressBar)
self.button2 = QtWidgets.QToolButton(self)
self.progressBar2 = QtWidgets.QProgressBar(self)
hlayout2 = QtWidgets.QHBoxLayout()
hlayout2.addWidget(self.button2)
hlayout2.addWidget(self.progressBar2)
vlayout = QtWidgets.QVBoxLayout()
vlayout.addLayout(hlayout)
vlayout.addLayout(hlayout2)
self.setLayout(vlayout)
app = QtWidgets.QApplication(sys.argv)
main = TsQThread()
main.show()
app.exec_()
界面逻辑分离,先写逻辑层,再把逻辑放到界面上,切不可混合
不能以界面为触发条件,应该以数据结构
wrapped C/C++ object of type DiameterWidget has been deleted
#check框
self.MSPsListWidget=QtWidgets.QListView()
self.itemModel = QtGui.QStandardItemModel()
self.MSPsListWidget.setModel(self.itemModel)
item=QtGui.QStandardItem('text')
item.setCheckable(True)
self.itemModel.setItem(i,0,item)
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class TreeWidget(QMainWindow):
myControls ={}
def __init__(self,parent=None):
QWidget.__init__(self,parent)
self.setWindowTitle('TreeWidget')
self.tree = QTreeWidget()
self.myControls['tree']=self.tree
self.tree.setColumnCount(2) # 说明是树形的表,
self.tree.setHeaderLabels(['Key','Value']) # 是表,则有表头
# 根节点的父是 QTreeWidget对象
root= QTreeWidgetItem(self.tree)
root.setText(0,'root')
child1 = QTreeWidgetItem(root) #指出父结点
child1.setText(0,'child1')
child1.setText(1,'name1')
child2 = QTreeWidgetItem(root)
child2.setText(0,'child2')
child2.setText(1,'name2')
child3 = QTreeWidgetItem(root)
child3.setText(0,'child3')
child4 = QTreeWidgetItem(child3)
child4.setText(0,'child4')
child4.setText(1,'name4')
#以下两句是主窗口的设置
self.tree.addTopLevelItem(root)
self.setCentralWidget(self.tree)
#带图标是这形式QAction(QIcon("ss.png"), "add", self)
addAction = QAction( "增加", self)
addAction.triggered.connect(self.on_addAction_triggered)
editAction = QAction("修改", self)
editAction.triggered.connect(self.on_editdAction_triggered)
deleteAction = QAction("删除", self)
deleteAction.triggered.connect(self.on_deleteAction_triggered)
findAction = QAction("查找", self)
findAction.triggered.connect(self.on_findAction_triggered)
toolbar = self.addToolBar("aa")
toolbar.addAction(addAction)
toolbar.addAction(editAction)
toolbar.addAction(deleteAction)
toolbar.addAction(findAction)
def on_addAction_triggered(self):
currNode = self.tree.currentItem()
addChild1 =QTreeWidgetItem()
addChild1.setText(0,'addChild1_key')
addChild1.setText(1, 'addChild1_val')
currNode.addChild(addChild1)
def on_editdAction_triggered(self):
currNode = self.tree.currentItem()
currNode.setText(0,'editkey')
currNode.setText(1, 'editvalue')
def on_deleteAction_triggered(self):
currNode = self.tree.currentItem()
parent1=currNode.parent();
parent1.removeChild (currNode)
def on_findAction_triggered(self):
#MatchRegExp 正则查找,MatchRecursive递归遍历,最后是指树表的第几列值
#本例是 查找第0中 所有开头含有”child“文字的节点
nodes=self.tree.findItems ("^child[\w|\W]*",Qt.MatchRegExp | Qt.MatchRecursive ,0)
for node in nodes :
QMessageBox.information(self, '', node.text(0))
app = QApplication(sys.argv)
tp = TreeWidget()
tp.show()
app.exec_()