【问题标题】:PyQt 4: Get Position of ToolbarPyQt 4:获取工具栏的位置
【发布时间】:2017-01-05 11:53:59
【问题描述】:

大家好,

在我的可执行程序中有一个工具栏。好吧,用户决定移动工具栏。现在工具栏是浮动的。我知道我必须连接用户安排工具栏时发出的浮动信号。如何保存工具栏的新位置?我知道将工具栏添加到主窗口的方法,位置为:self.addToolBar( Qt.LeftToolBarArea , toolbar_name)。在handle_floating() 方法中,您会看到我想要的:我想获得当前的位置,但是如何获得?您还看到我刚刚添加了一个名为self.toolbar_pos 的成员变量来保存工具栏的位置。我的想法是,当应用程序终止时,我想将此值序列化到一个文件中,稍后,当再次运行应用程序时,它将读取该文件并相应地设置工具栏。但这没有问题。目前我不知道要获得工具栏的位置。

我需要你的帮助:)

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.toolbar_pos = None

        self.initUI()      

    def initUI(self):               

        exitAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(QtGui.qApp.quit)

        self.toolbar = QtGui.QToolBar(self)
        self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.addToolBar(self.toolbar )
        self.toolbar.addAction(exitAction)

        self.toolbar.setAllowedAreas(QtCore.Qt.TopToolBarArea
                                     | QtCore.Qt.BottomToolBarArea
                                     | QtCore.Qt.LeftToolBarArea
                                     | QtCore.Qt.RightToolBarArea)

        self.addToolBar( QtCore.Qt.LeftToolBarArea , self.toolbar )

        self.toolbar.topLevelChanged.connect(self.handle_floating)


    def handle_floating(self, event):
        #   The topLevel parameter is true
        #   if the toolbar is now floating
        if not event:
            #   If the toolbar no longer floats,
            #   then calculate the position where the
            #   toolbar is located currently.
            self.toolbar_pos = None
            print "Get position: ?"



def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.setGeometry(300, 300, 300, 200)
    ex.setWindowTitle('Toolbar example')    
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python-2.7 qt pyqt4


    【解决方案1】:

    QMainWindow 类已经有用于此的 API:即 saveStaterestoreState。这些可用于保存和恢复应用程序中所有工具栏和停靠小部件的状态。

    要使用它们,您首先需要确保所有工具栏和停靠小部件在创建时都具有唯一的对象名称:

    class Example(QtGui.QMainWindow):
        ...
        def initUI(self):               
            ...
            self.toolbar = QtGui.QToolBar(self)
            self.toolbar.setObjectName('foobar')
    

    然后你可以覆盖closeEvent来保存状态:

        class Example(QtGui.QMainWindow):
            ...
            def closeEvent(self, event):
                with open('/tmp/test.conf', 'wb') as stream:
                    stream.write(self.saveState().data())
    

    (注意:我刚刚在这里使用了一个临时文件进行测试,但在您的实际应用程序中使用QSettings 之类的东西显然会好得多)。

    终于可以恢复之前保存的状态了:

    class Example(QtGui.QMainWindow):    
        def __init__(self, parent=None):
            ...
            self.initUI()
    
            try:
                with open('/tmp/test.conf', 'rb') as stream:
                    self.restoreState(QtCore.QByteArray(stream.read()))
            except IOError:
                pass
    

    【讨论】:

    • 您的解决方案非常有用。助教。但我有一个小问题。通过覆盖closeEvent()-method,您即将将主窗口的状态保存在一个文件中。那么,你为什么使用.data()-function?
    • @Sophus。 saveState 方法返回 QByteArray。在某些版本的 python/pyqt 中,可以使用 python 将其直接写入文件 - 但在其他版本中则不然。 QByteArraydata() 方法将其转换为 python bytes 对象 - 这意味着它保证可以与所有版本的 python/pyqt 一起使用。但是,如果你使用QSettings来保存状态,你就不必担心这些兼容性问题,因为文件写入都是由Qt完成的。​​
    • @Sophus。 PS:实际上,为了完全兼容,restoreState 方法可能也应该明确使用QByteArray(我已经相应地更新了我的答案)。
    • 你是最棒的 :) TA :) 好吧,我还有一个问题:我知道文件模式。在您的解决方案中,您将所有数据保存(在 python 中:写入)为二进制文件,我想当我想编写 *.jpeg 文件或其他内容时必须使用“wb”。
    • @Sophus。不确定您的意思-我的示例读取和写入字节并使用b(二进制/字节)模式。 QByteArray 包含未编码的字节,而不是文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多