专栏首页Python编程 pyqt matplotlibPyQt5 非模态对话框(apply 型)

PyQt5 非模态对话框(apply 型)

如果希望用户可以重复更改对话框中的参数并能马上看到修改结果,那么就要使用非模态对话框,这样用户就可以按照他们喜欢的方式来持续不断地修改数据并验证修改的结果了。

非模态对话框对话框通常都有一个应用(Apply)按钮和一个关闭(close)按钮。用户一旦点击了应用按钮,改变就会发生,对话框也不会关闭,可以连续点击应用按钮,直到关闭了对话框。

具体的运用请参见如下代码。

import sys
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import *
#非模态对话框("Apply"型更新),字体选择组合框,自定义信号
class FontPropertiesDlg(QDialog):
 
    applySignal = pyqtSignal(str,int,bool)#自定义信号
 
    def __init__(self,parent=None):
        super().__init__(parent)
        #print(self.parent().windowTitle())
        FontStyleLabel = QLabel("字体:")
        self.FontstyleComboBox = QFontComboBox()#字体选择组合框
        self.FontEffectCheckBox =QCheckBox("使用特效")
        FontSizeLabel = QLabel("字体大小")
        self.FontSizeSpinBox = QSpinBox()
        self.FontSizeSpinBox.setRange(6, 36)
        self.FontSizeSpinBox.setValue(12)
        #这次没有采用QButtonBox
        okButton = QPushButton("应用")
        cancelButton = QPushButton("关闭")
        buttonLayout = QHBoxLayout()
 
        buttonLayout.addStretch()
        buttonLayout.addWidget(okButton)
        buttonLayout.addWidget(cancelButton)
        layout = QGridLayout()
 
        layout.addWidget(FontStyleLabel, 0, 0)
        layout.addWidget(self.FontstyleComboBox, 0, 1)
        layout.addWidget(FontSizeLabel, 1, 0)
        layout.addWidget(self.FontSizeSpinBox, 1, 1)
        layout.addWidget(self.FontEffectCheckBox,1,2)
        layout.addLayout(buttonLayout, 2, 2)
        self.setLayout(layout)
        okButton.clicked.connect(self.accept)
        cancelButton.clicked.connect(self.reject)
 
        self.setWindowTitle("字体")
    def accept(self):#重新实现accept方法
        #发射自定义信号
        self.applySignal.emit(self.FontstyleComboBox.currentText(),
                              self.FontSizeSpinBox.value(),
                              self.FontEffectCheckBox.isChecked())
        #也可以 调用 self.parent()得到父窗口的句柄,从而向父窗口传递值
        #和控制父窗口的行为,但是耦合度过高,不推荐
        #print(self.parent())
        #print(self.topLevelWidget())#Pyqt5中此方法没有了?
 
        #self.hide()#应用后隐藏,为了可以连续点应用按钮,一般不隐藏
 
class MainDialog(QDialog):
    def __init__(self,parent=None):
        super(MainDialog,self).__init__(parent)
        self.FontPropertiesDlg=None
        self.format=dict(fontstyle="宋体",fontsize=10,fonteffect=False)
        FontButton = QPushButton("设置字体(非模态)")
        self.label = QLabel("默认选择")
        layout = QGridLayout()
        layout.addWidget(FontButton,0,0)
        layout.addWidget(self.label)
        self.setLayout(layout)
        FontButton.clicked.connect(self.FontModalessDialog)
 
        self.setWindowTitle("非模态对话框")
        #self.setFixedSize(self.width(), 100)#固定窗口大小
 
        self.labelFont = QFont(self.format["fontstyle"],self.format["fontsize"])
        self.updateLabel()
        self.modalessDialog = None#初始值设为空,
 
    def updateLabel(self):
        self.label.setFont(self.labelFont)
        self.label.setText("选择的字体:%s    字体大小:%d    是否特效:%s" %(self.format["fontstyle"],self.format["fontsize"],self.format["fonteffect"]))
 
    def updateUI(self,fontstyle,fontsize,fonteffect):#For modaless dialog
        self.format["fontstyle"] = fontstyle
        self.format["fontsize"] = fontsize
        self.format["fonteffect"] = fonteffect
 
        self.labelFont = QFont(fontstyle,fontsize)
        self.updateLabel()
 
    def FontModalessDialog(self):
        #仅第一次调用的时候创建对话框,所有可保留对话框的各项设置
        if self.modalessDialog is None:
            self.modalessDialog = FontPropertiesDlg(self)
            #连接从对话框接发出的自定义信号
            self.modalessDialog.applySignal.connect(self.updateUI)
        self.modalessDialog.show()#非模态地显示对话框
 
app = QApplication(sys.argv)
font= MainDialog()
font.show()
app.exec_()

本文分享自微信公众号 - Python编程 pyqt matplotlib(wsplovePython),作者:wsp001

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PyQt5 非模态对话框(live 型)

    本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动...

    用户6021899
  • PyQt5 模态对话框

    所谓的模态对话框是指,一旦调用该对话框,它就会成为应用程序唯一能与用户进行交互的部件。在关闭对话框之前,用户都不能使用应用程序的其他部件。模态对话框是最简单的,...

    用户6021899
  • 箱线图(BoxPlot) App

    由于公司的Execl版本(v2010)偏低,没有画箱线图的功能,故我用python写了一小段程序,可以用来画箱线图。绘图库使用的还是matplotlib。

    用户6021899
  • pygame-KidsCanCode系列jumpy-part11-角色动画(下)

    接上节继续,上节并没有处理向左走、向右走的动画效果,这节补上,看似很简单,但是有一些细节还是要注意:

    菩提树下的杨过
  • 我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)

    之前的小工具,远程读卡器web客户端,实现原理是把读写卡服务装在远程(现场)的电脑上,这样有一些缺点,比如现场电脑必须开启端口映射,让客户端能否访问到。只能写好...

    特立独行的猫a
  • Pytorch实现卷积神经网络训练量化(QAT)

    深度学习在移动端的应用越来越广泛,而移动端相对于GPU服务来讲算力较低并且存储空间也相对较小。基于这一点我们需要为移动端定制一些深度学习网络来满足我们的日常续需...

    BBuf
  • iOS开发实战-时光记账Demo 本地数据库版效果分析Demo地址

    由于主页只是一个展示的时光轴界面,UIScrollView加几个按钮就能完成,需要读取数据库内容,所以我们先把内页-增加账单 完成。

    gwk_iOS
  • 10.带人机对战的五子棋程序

    今天我们带来一个带人机对战功能的五子棋程序。程序基于前面文章中的框架搭建,新增人机对战的策略。程序基于规则进行决策,不考虑禁手,玩家执黑子先行。棋盘规模采用15...

    用户4381798
  • Objective-C AVPlayer播放视频的使用与封装大致效果界面搭建Demo地址

    看下成员变量就知道我怎么搭建的了,这里我将video播放层的size作为参照量,对所有控件的size按照其video的size宽高进行比例缩放

    gwk_iOS
  • 6.wxPython防止窗体重画棋子消失的机制

    可以画图的类中wx.ClientDC不必依赖窗体绘画事件,可以随时实例化,随时画图。但是窗体最小化之后再恢复,重画的窗体上通过wx.ClientDC绘制的棋子会...

    用户4381798

扫码关注云+社区

领取腾讯云代金券