2016-08-23 6 views
0

Ich kann nicht ganz herausfinden, wie die Sicherung und Wiederherstellung funktionieren soll, so dass ich die Dockwidgets Geometrics speichern kann, wenn die Anwendung geschlossen und erneut geöffnet wird. Ich habe 5 Dockwidgets, die ich gerne haben würde.Speichern und Wiederherstellen von Dockwidgets Position und Größe

Ich nehme ich beide restoreState und saveState jeweils in init und close verwenden. Aber wie konfiguriere ich es?

Mainwindow-Klasse

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from DockWindowGraph import Dock 

class Window(QMainWindow): 
    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     self.centralWindow_ = QFrame() 
     self.setCentralWidget(None) 

     self.CreateWidgets() 

     self.settings = QSettings() 
     self.restoreState() 

    def CreateWidgets(self):   
     self.toolbar = self.addToolBar('Toolbar') 
     self.toolbar.setMovable(False)  

     exitA = QAction(QIcon('Images/gj.png'), 'Exit', self) 
     exitA.setShortcut('Ctrl+Q') 
     exitA.setStatusTip('Exit application') 
     exitA.triggered.connect(self.close) 
     self.toolbar.addAction(exitA) 

     openDock_ = QAction(QIcon('Images/gj.png'), 'Open', self) 
     openDock_.setShortcut('Ctrl+E') 
     openDock_.setStatusTip('Open Dock') 
     openDock_.triggered.connect(self.OpenDockWindow) 
     self.toolbar.addAction(openDock_) 

     self.setWindowTitle("We do not sow") 
     self.showFullScreen() 

     self.firstDock_ = Dock(self, 'First') 
     self.firstDock_.setObjectName('First') 
     self.addDockWidget(Qt.LeftDockWidgetArea, self.firstDock_)  

     self.secondDock_ = Dock(self, 'Second') 
     self.firstDock_.setObjectName('Second') 
     self.addDockWidget(Qt.LeftDockWidgetArea, self.secondDock_) 

     self.thirdDock_ = Dock(self, 'Third') 
     self.thirdDock_.setObjectName('Third') 
     self.splitDockWidget(self.firstDock_, self.thirdDock_, Qt.Horizontal) 

     self.fDock_ = Dock(self, 'Fourth') 
     self.fDock_.setObjectName('Fourth') 
     self.splitDockWidget(self.firstDock_, self.fDock_, Qt.Horizontal) 

     self.fiDock_ = Dock(self, 'Fifth') 
     self.fiDock_.setObjectName('Fifth') 
     self.splitDockWidget(self.firstDock_, self.fiDock_, Qt.Vertical) 

     self.setTabPosition(Qt.AllDockWidgetAreas, QTabWidget.North) 

    def OpenDockWindow(self): 
     dock_ = Dock((self.frameGeometry().width()/2), self.firstDock_) 

     self.addDockWidget(Qt.RightDockWidgetArea, dock_) 
     self.tabifyDockWidget(self.secondDock_, dock_) 

    def closeEvent(self, event): 
     print('closing') 

     settings_ = QSettings() 
     self.saveState() 


app = QApplication(sys.argv) 
app.setOrganizationDomain('ltd') 
app.setOrganizationName('Alg') 
w = Window() 
sys.exit(app.exec_()) 

mein Dock Klasse:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from DockWindowFrame import Frame 

class Dock(QDockWidget): 
    def __init__(self, title, parent=None): 
     super(Dock, self).__init__(parent) 

     self.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea | Qt.TopDockWidgetArea | Qt.BottomDockWidgetArea) 
     self.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) 

     self.frame = Frame() 
     self.frame.setStyleSheet("QWidget { background-color: rgba(0,220,0,100%)}") 
     self.setWidget(self.frame) 

    def ReturnFrame(self): 
     return self.frame 

EDIT: Fehler nach unten Antwort versuchen.

Traceback (most recent call last): 
    File "C:\Users\Rasmus\workspace\PyQtLearning\src\gg.py", line 90, in <module> 
    main() 
    File "C:\Users\Rasmus\workspace\PyQtLearning\src\gg.py", line 86, in main 
    w = Window() 
    File "C:\Users\Rasmus\workspace\PyQtLearning\src\gg.py", line 14, in __init__ 
    self.readSettings() 
    File "C:\Users\Rasmus\workspace\PyQtLearning\src\gg.py", line 72, in readSettings 
    self.restoreGeometry(settings.value("geometry").toByteArray()) 
AttributeError: 'NoneType' object has no attribute 'toByteArray' 

Antwort

2

Das funktioniert hier:

def __init__(self): 
    self.readSettings() 

def closeEvent(self, event): 
    print('closing') 
    settings = QSettings() 
    settings.setValue('geometry',self.saveGeometry()) 
    settings.setValue('windowState',self.saveState()) 
    super(Window, self).closeEvent(event) 

def readSettings(self): 
    settings = QSettings() 
    self.restoreGeometry(settings.value("geometry").toByteArray()) 
    self.restoreState(settings.value("windowState").toByteArray()) 

Referenz: QMainWindow.saveState() QMainWindow.restoreState()

Voll Code:

# coding = u8 
import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Window(QMainWindow): 
    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     self.centralWindow_ = QFrame() 
     self.setCentralWidget(None) 

     self.CreateWidgets() 
     self.readSettings() 

    def CreateWidgets(self):   
     self.toolbar = self.addToolBar('Toolbar') 
     self.toolbar.setMovable(False)  

     exitA = QAction(QIcon('Images/gj.png'), 'Exit', self) 
     exitA.setShortcut('Ctrl+Q') 
     exitA.setStatusTip('Exit application') 
     exitA.triggered.connect(self.close) 
     self.toolbar.addAction(exitA) 

     openDock_ = QAction(QIcon('Images/gj.png'), 'Open', self) 
     openDock_.setShortcut('Ctrl+E') 
     openDock_.setStatusTip('Open Dock') 
     openDock_.triggered.connect(self.OpenDockWindow) 
     self.toolbar.addAction(openDock_) 

     self.setWindowTitle("We do not sow") 
     self.showFullScreen() 

     self.firstDock_ = Dock(self, 'First') 
     self.firstDock_.setObjectName('First') 
     self.addDockWidget(Qt.LeftDockWidgetArea, self.firstDock_)  

     self.secondDock_ = Dock(self, 'Second') 
     self.firstDock_.setObjectName('Second') 
     self.addDockWidget(Qt.LeftDockWidgetArea, self.secondDock_) 

     self.thirdDock_ = Dock(self, 'Third') 
     self.thirdDock_.setObjectName('Third') 
     self.splitDockWidget(self.firstDock_, self.thirdDock_, Qt.Horizontal) 

     self.fDock_ = Dock(self, 'Fourth') 
     self.fDock_.setObjectName('Fourth') 
     self.splitDockWidget(self.firstDock_, self.fDock_, Qt.Horizontal) 

     self.fiDock_ = Dock(self, 'Fifth') 
     self.fiDock_.setObjectName('Fifth') 
     self.splitDockWidget(self.firstDock_, self.fiDock_, Qt.Vertical) 

     self.setTabPosition(Qt.AllDockWidgetAreas, QTabWidget.North) 

    def OpenDockWindow(self): 
     dock_ = Dock((self.frameGeometry().width()/2), self.firstDock_) 

     self.addDockWidget(Qt.RightDockWidgetArea, dock_) 
     self.tabifyDockWidget(self.secondDock_, dock_) 

    def closeEvent(self, event): 
     print('closing') 
     settings = QSettings() 
     settings.setValue('geometry',self.saveGeometry()) 
     settings.setValue('windowState',self.saveState()) 
     super(Window, self).closeEvent(event) 

    def readSettings(self): 
     settings = QSettings() 
     self.restoreGeometry(settings.value("geometry").toByteArray()) 
     self.restoreState(settings.value("windowState").toByteArray()) 

class Dock(QDockWidget): 
    def __init__(self, title, parent=None): 
     super(Dock, self).__init__(parent) 

     self.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea | Qt.TopDockWidgetArea | Qt.BottomDockWidgetArea) 
     self.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) 

def main(): 
    app = QApplication(sys.argv) 
    app.setOrganizationDomain('ltd') 
    app.setOrganizationName('Alg') 
    w = Window() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Ich bekam einen Keine-Typ. Aber finden Sie eine mögliche Lösung für http://stackoverflow.com/questions/11352157/pyqt-window-i-want-to-remember-the-location-it-was-closed-at. Aber als ich meine App abgeschossen und versucht habe, sie wieder zu öffnen. Es wird überhaupt nicht geöffnet. – vandelay

+0

@vandelay - Ihr Code funktioniert gut an meiner Stelle. Ich poste sie im Mai antworten. – pingze

+0

Ich habe versucht, den vollen Code einzufügen, aber es gibt mir einen 'NoneType'. Wenn ich ein wenn nicht Settings.value() == None. Es wird das erste Mal laufen. Aber wenn ich die Anwendung das zweite Mal starte, bekomme ich ein Fenster mit "Python hat aufgehört zu arbeiten". Kann das etwas mit Eclipse/Pydev zu tun haben? – vandelay

Verwandte Themen