打开 QDialog 并保存最后的状态

2024-01-10

我正在尝试打开一个QDialog from a QMainWindow,并且在关闭`QDialog之后,如果我需要再次打开它,它必须打开并显示与我关闭它时相同的信息。

这是代码QMainWindow:

class A (QMainWindow):
  def __init__(self):
    QMainWindow.__init__(self)

    #I create a QPushButton to open the QDialog
    self.axes1 = self.figure_canvas.figure.add_axes ([0.8, 0.01, 0.19, 0.05])
    self.button = QPushButton(self.axes1,"Open Dialog")
    self.button.on_clicked(self.OpenDialog)

    #This is the method to open the QDialog which is in another module
  def OpenDialog(self, event):
    text = configurePort.ConfigurePort.retrieve_data(self)
    print text

这段代码的作用是在我的QMainWindow当我点击它时,它会打开一个QDialog,它是在另一个模块中创建的。这是代码QDialog:

class ConfigurePort(QDialog):
  def __init__(self, parent = None):
     QDialog.__init__(self, parent)
     uic.loadUi("configurePort.ui", self)

    #I create a button to check active ports and show them
    self.connect(self.btn_checkconn, SIGNAL("clicked()"), self.check_ports)

    #This method calls another class which opens another QDialog
    #and I select the port that I want
  def check_ports(self):
     self.check_serial = CheckPorts(self)
     self.check_serial.exec_()

    #After selecting the port, when I close the QDialog of the class named above
    #the port´s name appears in the first QDialog
  @classmethod
  def retrieve_data(cls, parent = None):
     dlg = cls(parent)
     dlg.exec_()
     text = dlg.getPortText()
     return text

  def closeEvent(self, event):
     #Here is where I need to write the code to close the QDialog 
     #and it does not has to be an event

在该方法中,closeEvent,我需要编写必要的代码,以便我可以关闭窗口,并使用打开它时使用的相同按钮,使用关闭窗口时显示的最后信息再次打开它。

我尝试过使用QSettings但它不起作用(也许我用错了)。我尝试了show() and hide()类的PyQt也是,但是没有用。希望你能帮我。

- - - 编辑 - - -

我编辑了上面的代码。我添加了一些方法以便更好地理解。所以,我打开QDialog called ConfigurePort它显示了这一点:

红色圆圈包围着港口的名称。它显示在一个QLabel,我从QDialog然后当我关闭时打印它QDialog。我之所以能做到这一点,要归功于我之前提出的一个问题,该问题位于此链接中:

使用 PyQt 从子进程获取数据 https://stackoverflow.com/questions/37302213/getting-data-from-child-using-pyqt/37307475#37307475

The check_port上面代码中显示的方法,打开另一个QDialog效果很好。这样我就可以在我的电脑中选择我需要的端口。所以,这并不重要。

所以,关闭之后QDialog(并选择例如“COM3”,如图所示),我需要再次打开它,并查看关闭它之前显示的相同信息。

我尝试添加这一行,使用QSettings :

self.settings = QSettings("MyCompany", "MyApp")
  if not self.settings.value("windowsState") == None:
    self.restoreState(self.settings.value("windowState"))

但正如我之前所说,我认为我没有正确使用它,但我希望我可以使用更简单的方法来解决这个问题。

----- 编辑 2 -----

感谢@Brendan Abel 的帮助,我有这个代码:

class ConfigurePort(QDialog):
  def __init__(self, parent):
    super(ConfigurePort, self).__init__(parent)
    uic.loadUi("configurePort.ui", self)

    self.myValue = 10
    self.restoreSettings()

    self.connect(self.btn_checkconn, SIGNAL("clicked()"), self.check_ports)
    self.buttonBox.button(QDialogButtonBox.Cancel).clicked.connect(self.close)
    self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.closeEvent)

    self.iniUi()

  def check_ports(self):
    pass

  def iniUi(self):
    pass #I just create some QLabels in here

  @classmethod
  def retrieve_data(cls, parent = None):
    dlg = cls(parent)
    dlg.exec_()
    text = dlg.getPortText()
    return text

  def closeEvent(self, event):
    self.saveSettings()
    super(QDialog,self).closeEvent(event)

  def saveSettings(self):
    settings = QSettings("MyOrg", "MyApp")
    settings.setValue("myValue", self.myValue)

  def restoreSettings(self):
    settings = QSettings("MyOrg", "MyApp")
    self.myValue = settings.value("myValue", self.myValue)

这给了我这个错误:TypeError: QWidget.closeEvent(QCloseEvent): argument 1 has unexpected type 'bool'我知道我错过了一些东西,但我看不到它。


有几种方法可以保存此数据通常,要跨会话保存数据,您可以使用QSettings并将数据加载到__init__并将其保存在closeEvent method

一般来说,它看起来像这样。这也假设您使用v2的版本QVariant应用程序编程接口;否则,返回的结果是QSettings.value将是一个QVariant并且您需要将其转换为适当的 python 类型。如果您使用的是最新版本PyQt那么你应该在v2, 但如果没有你可以强迫它 https://stackoverflow.com/a/6238226/1547004将其粘贴在文件的顶部

import sip
sip.setapi('QVariant', 2)
sip.setapi('QString', 2)


class MyDialog(QDialog):

    def __init__(self, parent):
        super(MyDialog, self).__init__(parent)
        self.myvalue = 10
        self.restoreSettings()

    def closeEvent(self, event):
        self.saveSettings()
        super(MyDialog, self).closeEvent(event)

    def saveSettings(self):
        settings = QSettings('myorg', 'myapp')
        settings.setValue('myvalue', self.myvalue)

    def restoreSettings(self):
        settings = QSettings('myorg', 'myapp')
        self.myvalue = settings.value('myvalue', self.myvalue)

EDIT:

您的代码中的错误是由以下原因引起的:

self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.closeEvent)

您不应致电或连接至closeEvent直接地。相反,您应该连接到.close or .accept

self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.accept)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打开 QDialog 并保存最后的状态 的相关文章

随机推荐

  • 当新消息进入服务总线队列时,Azure 函数(服务总线触发器)无法启动

    创建了一个 Azure Function 它是在 Visual Studio 中触发并从 Visual Studio 发布到 Azure 的服务总线 每当消息进入队列时 手动运行时该函数都会在本地正常运行 但期望的是当消息在队列中时该函数应
  • 无法添加对我的项目的引用 - 它根本没有检测到它

    所以我发现了这个很棒的图书馆WatiN http watin org 我已经下载了最新版本 v2 1 我打开了一个控制台应用程序 显然是 C 并编写了我最简单的程序 using WatiN Core FireFox browser new
  • 如何将会话生命周期设置为无限

    如何将会话生命周期设置为无限 有一个设置session cookie lifetime 但我找不到需要将其设置为无限生命周期的值 我已经尝试过 0 但一旦浏览器关闭它就会过期 ini set session cookie lifetime
  • MongoDB 查找文档的所有属性

    如何在 mongodb 中创建查询以按文档的任何属性进行过滤 我有一个对象集合如下 id name John city Rio de Janeiro state RJ address Street 1 我的页面上有一个字段 允许用户检索任何
  • 我们可以从 Visual Studio 任务运行器资源管理器运行 npm start

    我正在 Visual Studio 中设置 Angular 4 代码 我可以从 Visual Studio 成功构建 但是如果我想启动角度代码 我会进入命令提示符并手动输入npm start运行应用程序 运行后npm start 我使用注册
  • SQLAlchemy 中的元数据到底是什么?

    元数据 SQLAlchemy 到底是什么 我很难理解这一点 元数据和引擎有什么区别 元数据是表定义的集合 引擎是特定数据库的方言和连接详细信息 以及保存已与该数据库建立的任何连接的连接池
  • 如何更改 Umbraco 中的 URL 名称

    这是我第一次使用 Umbraco 我使用错误的命名格式创建了文档类型 页面 现在这已经变成了我的页面 URL 例如 about page 我该如何将它们更改为 about因为我搜索了后端管理面板 似乎没有一个选项可以更改他们的link to
  • 在 .rc 文件中设置发布者字段

    我收到这样的消息 我需要在 rc 资源文件 中设置我的发布者名称才能在此窗口中显示它 您需要设置您的 FileDescription 和 CompanyName 字段版本资源 http msdn microsoft com en us li
  • 尊重代码中的空间但忽略 CSS?

    使用CSS我可以让浏览器忽略 nbsp 字符但尊重正常的空白 So this Some text nbsp nbsp More text 显示如下 一些文字 更多文字 Not 一些文字 更多文字 更新我的代码中实际上有更多的空白 我需要默认
  • Android 意图让 SD 卡准备就绪

    我有一个使用 SD 卡上的文件的应用程序 该应用程序在手机启动时运行 并且很明显 当该程序首次运行时无法访问该文件 因为它在 SD 卡可用之前开始工作 是否有广播接收器可以用来告知 SD 卡何时准备就绪 Update 只是总结一下注册意图的
  • 如何在绘图表达散点图中只有一条多种颜色的趋势线?

    我想创建一个只有一条趋势线的散点图 Plotly Express 为点列表中的每种颜色创建不同的趋势线 import plotly express as px value 15 20 35 40 48 years 2010 2011 201
  • EA14.0 中的“覆盖属性初始值设定项”行为更改为 EA12.5 中的“设置运行状态”

    我观察到 EA14 0 中的行为与 EA12 5 中的行为有所不同 Summary 在 EA12 5 中使用时Deployment Specification必须设置Instance Classifier on the Deployment
  • Protractor:Protractor 中的ignoreSynchronization 和async/await 有什么区别

    我是量角器的新手 我正在做测试来熟悉它 在这里 我遇到了一个问题 我无法区分ignoreSynchronization和async await方法 我有 3 个区块来测试它们 第一个是量角器自己的异步功能 it without await
  • https 在 Fiddler 和 .NET 中给出 ERR_CONNECTION_RESET

    谁能向我解释一下为什么在 Chrome 中输入此链接 https secure malindoair com MalindoAirCIBE OnlineBooking aspx https secure malindoair com Mal
  • MVC3 默认模板在哪里存储用户帐户信息?

    你能告诉我当我注册新帐户时 asp net mvc3默认模板将登录信息存储在哪里吗 它在调试模式下本地运行 在没有安装SQLExpress的情况下 注册功能根本不起作用 由于我安装了它 所以我可以使用注册 登录功能 但我在SQLExpres
  • stdin 上的 close/fclose 是否保证正确?

    似乎以下调用执行了您所期望的操作 关闭流并不允许任何进一步的输入 等待流上的输入的任何操作都会返回错误 但它是否保证在所有编译器 平台上都是正确的 close fileno stdin fclose stdin fclose stdin 导
  • .val() 未从输入获取更新值

    我有两个输入字段 我试图通过单击按钮使用 jquery 获取它们的值 这似乎是一个非常简单的操作 但我一生都无法让它发挥作用 这是代码片段 Name
  • 累加值,例如通过扫描,但可以随着时间的推移重置累加器

    我有一个可观察的 obs1 它代表一段时间内的数字流 我需要累积这些数字的总和并逐步发出它 即 很长一段路要说我需要使用scan操作员 然后是第二个 Observable obs2 代表某种 重置时间 换句话说 当obs2发出 我必须重置我
  • Opengl 深度缓冲区和剔除

    OpenGL 中使用背面剔除和深度缓冲区有什么区别 背面剔除是指 OpenGL 确定哪些面背对观看者 因此不可见 想象一个立方体 无论你如何旋转立方体 三个面始终是不可见的 找出这些面是哪些面 将它们从要绘制的多边形列表中删除 这样您就将绘
  • 打开 QDialog 并保存最后的状态

    我正在尝试打开一个QDialog from a QMainWindow 并且在关闭 QDialog之后 如果我需要再次打开它 它必须打开并显示与我关闭它时相同的信息 这是代码QMainWindow class A QMainWindow d