2017-01-05 18 views
1

Hy guys,PyQt 4: Position der Werkzeugleiste holen

In meinem ausführbaren Programm gibt es eine Symbolleiste. Nun, der Benutzer entscheidet, die Symbolleiste zu verschieben. Jetzt ist die Symbolleiste schwebend. Ich weiß, dass ich die Floating-Signale, die bei der Anordnung der Toolbar durch den Benutzer ausgegeben werden, mit einbeziehen muss. Wie kann ich die neue Position der Symbolleiste speichern? Ich kenne die Methode zum Hinzufügen der Symbolleiste zum Hauptfenster mit einer Position: self.addToolBar(Qt.LeftToolBarArea , toolbar_name). In der handle_floating() - Methode siehst du was ich will: Da möchte ich momentan die Position bekommen, aber wie? Sie sehen auch, dass ich gerade eine Elementvariable mit dem Namen self.toolbar_pos hinzugefügt habe, um die Position der Symbolleiste beizubehalten. Meine Idee ist, wenn die Anwendung beendet wird, möchte ich diesen Wert in eine Datei serialisieren, und später, wenn die Anwendung erneut ausgeführt wird, liest sie diese Datei und setzt die Symbolleiste entsprechend. Aber das ist kein Problem. Momentan habe ich keine Idee, die Position der Toolbar zu bekommen.

Ich brauche deine Hilfe :)

#!/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() 

Antwort

2

Die QMainWindow Klasse bereits APIs für diese hat: das heißt saveState und restoreState. Diese können verwendet werden, um den Status aller Symbolleisten und Dock-Widgets in Ihrer Anwendung zu speichern und wiederherzustellen.

, sie zu nutzen, müssen Sie zunächst sicherstellen, dass alle Symbolleisten und Dock-Widgets ein einzigartiges Objekt-Namen angegeben werden, wenn sie erstellt werden:

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

Dann können Sie closeEvent außer Kraft setzen, den Staat zu retten :

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

(NB: ich zum Testen verwenden hier eine temporäre Datei nur einmal, aber es wäre natürlich viel besser, so etwas wie QSettings in Ihrer realen Anwendung zu verwenden).

Schließlich können Sie den Zustand wiederherstellen, die zuvor gespeichert wurde:

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 
+0

Ihre Lösung ist sehr nützlich. TA. Aber ich habe eine kleine Frage. Durch das Überschreiben der 'closeEvent() - Methode 'speichern Sie den Status des Hauptfensters in einer Datei. Nun, warum benutzt du die '.data() - Funktion?' – Sophus

+0

@Sophus. Die 'saveState' Methode gibt ein' QByteArray' zurück. In einigen Versionen von Python/Pyqt ist es möglich, das direkt in eine Datei mit Python zu schreiben - aber in anderen nicht. Die 'data()' Methode eines 'QByteArray' wandelt es in ein Python' bytes' Objekt um, was bedeutet, dass es garantiert mit allen Versionen von python/pyqt funktioniert. Wenn Sie jedoch 'QSettings' verwenden, um den Status zu speichern, müssen Sie sich über diese Kompatibilitätsprobleme keine Gedanken machen, da das Schreiben von Dateien von Qt erledigt wird. – ekhumoro

+0

@Sophus. PS: eigentlich sollte die 'restoreState' Methode zur vollen Kompatibilität wahrscheinlich auch' QByteArray' verwenden (ich habe meine Antwort entsprechend aktualisiert). – ekhumoro