【发布时间】:2018-11-12 11:11:25
【问题描述】:
我遇到了一个理论问题。我正在使用 pyqt5,但这可能是非常笼统且与框架无关的问题。
我有一个QMainwindow 坐在那里等待用户做事。用户可以根据自己的选择使用QMenu 和相关的快捷方式显示/隐藏 对话(QDockwidgets 的子类)(对于每个单独的对话来说,QAction 是一个可检查的QAction)。
我一直在努力有效地显示/隐藏对话。目前,我只是在启动时将它们全部启动,隐藏那些我一开始不想出现的。这使得触发对话变得容易,因为我可以 dialogue.show() /dialogue.hide() 取决于对话当前的可见性。
但我不敢相信这是最佳实践而且非常有效。
我已经尝试过(我目前没有在这台计算机上设置我的 pyqt 环境,所以我不得不剥离我的实际代码而无法测试它是否运行):
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class InfoPanel(QDockWidget):
def __init__(self, title='Tool Box'):
QDockWidget.__init__(self, title)
self.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetClosable)
self.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
frame = QFrame()
layout = QGridLayout()
self.canvas = QGraphicsView()
self.canvas.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(40, 40, 40)))
layout.addWidget(self.canvas)
frame.setLayout(layout)
self.setWidget(frame)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.showpanelAct = QAction("&Show Panel", self, enabled=True,checkable=True, shortcut="F10")
self.showpanelAct.triggered.connect(lambda: self.showPanel(0))
self.viewMenu = QMenu("&View", self)
self.viewMenu.addAction(self.showpanelAct)
self.setDockOptions(QMainWindow.AnimatedDocks)
def showPanel(self,i:int = 0): # this is not so smart - should construct and deconstuct to save memory!?
if i == 0: #infopanel
dialogueExists = True
try: self.infoPanel
#except NameError: #does not catch the error
except:
dialogueExists = False
if dialogueExists:
print('destroy')
self.infoPanel.destroy()
else:
print('create')
self.infoPanel = InfoPanel() #init
self.infoPanel.show()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
第一次有效,但在那之后,它似乎只会触发对话的破坏(令人惊讶的是,它不会破坏任何它只是继续进行的东西)。
为什么会这样?是否有一种标准方法来处理对话的显示隐藏?
【问题讨论】:
-
恕我直言,通常在程序启动时设置任何 GUI 内容(例如对话框),根据用户交互的需要显示/隐藏它,并在程序结束时将其销毁。我无法想象 GUI 对象消耗的内存值得按需创建/销毁它们。 (查看数据是个例外,例如大表的模型数据。当 GUI 的各个部分由于关闭对话框而隐藏时,我通常会丢弃这些数据。)这就是我在 Qt 中的做法。我以前在 gtkmm 中也这样做过,在 OSF/Motif 中也是如此。 (我不记得我从 Win3.1 的 GDI 开始时是如何做到的,可能是错误的。);-)
-
对于一种标准方式,您可以参考Qt doc中的大量示例。他们可能说明了他们(Qt 开发人员)认为应该如何使用它。
-
@Scheff 好的,所以在我的情况下,我可以对大多数对话执行此操作,并在程序开始时从启动画面隐藏对话的创建/隐藏。我确实有一些使用 mvc 的对话,为此我可能会在关闭它时销毁 data 以节省内存。我仍然很想知道为什么
try: ... except: ...方法不能按我的预期工作!? -
节省内存只是目的的一半。我不知道您如何将数据与模型和视图相结合。我非常喜欢信号驱动的东西。 IE。我的数据中经常有信号通知更改。 UI 类只是连接到这些信号并自动更新它们。对于同一数据的多个(不同)视图,这尤其便于维护。然而,Qt 更新在某些情况下是昂贵的(即非常慢),尤其是关于 MVC 小部件。因此,我尝试将更新限制在绝对必要的数量(通过清除隐藏 UI 的模型)。
-
关于
try: ... except: ...:你能把你的样本扩展到minimal reproducible example吗?
标签: qt user-interface pyqt5