找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

PyQt5 非模态对话框(apply 型)

admin 2019-2-10 15:49 233人围观 Qt相关

作者:Python编程 pyqt matplotlib

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

非模态对话框对话框通常都有一个应用(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_()


-------------------------------------------------------------------------
我们尊重原创,也注重分享,如若侵权请联系qter@qter.org。
-------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......


关于进行手机实名认证的紧急通知!
按照有关部门要求,论坛类网站必须完成手机实名认证才可以进行发帖等操作。希望大家积极配合,为创建一个和谐文明的社区而贡献自己的力量。我们会对会员的隐私进行严格保密,对大家造成的不便深表歉意! 我知道了