pyqt 小技巧 不定时更新

前言

用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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值