前言
用pyqt写代码,经常碰到一些问题,有的问题比较好搜索,有的问题找了半天才找到答案,记录一些个人认为值得记录的小技巧,以防下次使用在此查找半天。
Qcombox
qcombox 设置可修改 并修改完成回车触发
- qcombox 是可以修改标签值的 在设计师里面 editable 勾选即可
- qcombox 可以edittextchanged 是没改动一个字符,就触发一次 而通过下面写法,就可以使用lineedit的方法进行判断 比如回车触发等等
self.comboBox.lineEdit() 把当前选中行的lineedit调出来。
self.comboBox.lineEdit().returnPressed.connect
下拉框点击触发事件,比如点击下拉框刷新串口号
虽然说可以使用单独一个按钮来更新下拉框里面的内容,但是这样重视觉得不够方便快捷,找了网上一些资料 整合一下 踩了一些坑,终于实现了。利用事件过滤方法,感觉是用installeventfilter 开始事件过滤, 在窗口 捕捉已经开启的事件进行过滤。
class showui(QMainWindow, ui):
def __init__(self, parent=None):
super(showui, self).__init__(parent)
self.setupUi(self)
self.init_ui()
self.init_date()
self.init_connect()
def init_connect(self)
self.comboBox.installEventFilter(self)
def eventFilter(self, a0: 'QObject', a1: 'QEvent') -> bool:
"""
重写过滤器
:param a0: 触发的对象
:param a1:触发的时间 2是鼠标按下
:return: 0显示 1 不显示
"""
if a1.type()==a1.MouseButtonPress:
print(a0,self.comboBox ,a0==self.comboBox)
print(a1.type())
Qmenu
隐藏menu的菜单栏
pyqt菜单栏的menu菜单,直接使用menu.hide()是不会隐藏这个菜单的,可以先menuAction获取action之后再setVisible()这样就可以隐藏菜单了
self.menu.menuAction().setVisible(Flase)
Qmessage
qmessage隐藏按钮,一个按钮都不显示
在使用messagebox的时候 有的时候想去掉地下的按钮 什么都不要,但是如果设置的话 ,会自动添加一个ok按钮上去,这个ok按钮是在exec_的时候自动添加上去的,添加一个按钮在隐藏,我没有测试成功,最后查看了一下qmessage的组成,是两个label,和一个QDialogButtonBox,一个QGridLayout组成的,如果是这样的话,那直接把QDialogButtonBox隐藏起来不就好了,下帖代码,
re.children()[2].hide()
Dialog
Dialog 显示 最小化 最大化 和关闭按钮
dialog.setWindowFlags(
QtCore.Qt.WindowMaximizeButtonHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint)
pyqt中获取控件图像
pyqt中获取控件图像 使用控件的grab方法 ,返回的是pixmap 图片
p = self.chart_view.grab() #获取控件图片
p.save(chart.jpg)#保存到本地
Qtablewidge
tablewidget 清楚内容 不清楚列头
self.tableWidget.clearContents()
tablewidget 等宽等高
self.tableWidget.horizontalHeader().setSectionResizeMode(1)
self.tableWidget.verticalHeader().setSectionResizeMode(1)
Qtchart
qtchart 获取xy最大值最小值数据,找了半天资料找到的
self.chart.axisY().min()
self.chart.axisY().max()
qchart 设置样式
qchart支持的样式
QChart.ChartThemeLightL: 浅色(Light);0
QChart.ChartThemeBlueCerulean: 天蓝(Blue Cerulean);1
QChart.ChartThemeDark: 深色(Dark);2
QChart.ChartThemeBrownSand:棕色(Brown Sand);3
QChart.ChartThemeBlueNcs:蓝色NCS(Blue NCS);4
QChart.ChartThemeHighContrast:高对比(High Contrast);5
QChart.ChartThemeBlueIcy:蓝色Icy(Blue Icy);6
QChart.ChartThemeQt: Qt风格(Qt) 7
设置样式
class ChartBase(QChartView):
def __init__(self, *args, **kwargs):
super().__init__()
# 0 浅色 2 深色 输入对应数字也可以
theme = kwargs.get('theme', 2)
self.resize(800, 600)
self.setRenderHint(QPainter.Antialiasing,True) # 抗锯齿
self.chart().setTheme(theme)
QLABEL
QLABEL实现鼠标双击事件
定义事件的时候 把需要执行的函数,等于鼠标双击事件 ,在函数里面 加上args,引用鼠标双击时间的变量,不加args会报错
self.label_guangdaomozu.mouseDoubleClickEvent = self.change_guangdao_kval
def change_guangdao_kval(self,*args):
"""
:return:
"""
# print("常改光导系数",args)
res = mb.mes_input_num("请输入校准系数",item=self.guangdao_kval, minval=0.1,maxval=1)
if res:
self.guangdao_kval = res
sql3.alterData("switchpoint","val",res,"id",16)
self.label_guangdaomozu.setNum(res)
opencv
opencv读取图片在qlabel上面显示
在用opecv打开图片在qlabel显示的时候,发现截图有时候缩放的时候报错,然后程序退出,经错摸索测试与查找资料,最后发现是缩放的时候没有设定图形每行有多少字节,特此记录。
class A (object):
def importimgs(self):
"""
导入图片
:return:
"""
#获取文件名称
files = db.get_filename("",filter="文件类型(*.png)",isfiles=1)
self.importfiles=files
if not files:
return
# 显示第一张图片 , 这种写法可以读取中文路径图片
self.frame = cv2.imdecode(np.fromfile(files[0], dtype=np.uint8), 1)
self.show_img(self.frame)
def show_img(self,frame=np.ndarray):
"""
显示图片
:return:
"""
# 获取显示区域大小
rect = self.label_show.rect()
#缩放系数
self.kval_suofang = frame.shape[0] / rect.height()
width = frame.shape[1]
height = frame.shape[0]
# opencv读取的bgr格式转成rgb格式
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
#注意下面QtGui.QImage的第四个参数,意思为图像每行有多少个字节,不设定时,图像有时会歪,还可能会报错,所以一定要设定
self.qt_img = QImage(frame, width, height,width*3, QImage.Format_RGB888).scaled(int(width / self.kval_suofang),
int(height / self.kval_suofang),
Qt.IgnoreAspectRatio,
Qt.SmoothTransformation)
self.label_show.clear()
self.label_show.setPixmap(QPixmap.fromImage(self.qt_img))
显示问题
pyqt在不同dpi下显示字体大小不协调问题
在程序入口出添加适配高dpi代码
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QApplication
if __name__ == "__main__":
# 适应高DPI设备
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
# 适应Windows缩放
QtGui.QGuiApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
# 在QApplication创建之前设置上面的参数
app = QApplication(sys.argv)
#如果上面显示效果不好 就需要自己计算像素大小,手动设置,一般显示100% dpi是96
# 获取dpi,
dpi=app.primaryScreen().logicalDotsPerInch()