2010-03-02 6 views
3

내 MainWindow가 제공하는 saveState()/restoreState() 함수로 맞춤 DockWidget (QDockWidget에서 상속)을 저장하고 싶습니다.맞춤 DockWidgets 저장 방법

두 가지 질문이 있습니다. 1. Dockwidgets를 어떻게 저장하고 복원 할 수 있습니까?
- 이미 사용자 지정 DockWidgets를 QMetaType으로 등록하고 기본 생성자, 복사 생성자, 소멸자 및 스트리밍 연산자를 구현하려고했습니다.
2.로드 된 DockWidgets은 어떻게 식별 할 수 있습니까?
- 예 : 2 개의 DockWidgets이 저장되어 있고 restoreState()를 사용하여로드 한 경우 이러한로드 된 위젯에 대한 포인터를 얻을 수있는 방법이 있습니까?

감사합니다, 토비아스

+0

명백한 점을 체크하고 있지만 MainWindow는 저장하기 전에 2 개의 DockWidgets에 대한 포인터를 가지고 있습니까? – MSalters

+0

나는 DockWidgets를 만들고 그것들에 대한 포인터를 내 목록에 저장한다. 내 사용자 지정 DockWidget은 ConnectionWidget (QDockWidget에서 상속)이라고하고 포인터는 QList 목록에 있습니다. addWindow를 사용하여 MainWindow에 추가됩니다. saveState() 전에 findChildren 을 호출하면 모든 위젯을 가져옵니다. 내 DockWidgets에 대한 포인터를 다른 곳에 저장해야합니까? – Tobias

답변

2

QMainWindow::saveState 설명서를 읽었습니까?

개체의 이름이 고유합니까? (QObject::setObjectName) 보조 노트로

, QObjects 당신이 restoreState에 대해 뭔가 오해 것 같다 Q_DISABLE_COPY

+0

네, 설명서를 읽었지만 매우 짧아서 ... saveState가 작동하지 않는 것 같아요. 상태 변수는 INI 파일에 저장됩니다. 그러나 DockWidgets도 거기에 저장되지 않는 것 같습니다 ... 예, 테스트 목적으로 모든 객체 이름에 추가 된 정적 카운터를 추가했습니다. 복사 생성자를 추가 했으므로 직렬화를 위해 맞춤 메타 유형을 등록하는 것처럼 작동 할 수도 있습니다. 복사 생성자에 대한 정보를 제공해 주셔서 감사합니다! – Tobias

+0

dock 위젯의 인스턴스에서 setObjectName을 호출 했습니까? 그것은 Qt가 많은 것을 위해 그 이름을 사용함에 따라 매우 중요합니다. ini 파일에서 복원하는 작업은 다른 모든 작업에도 적용됩니까? 그렇지 않다면 saveState가 파일 인코딩에 의해 clobbered 될 수있는 QByteArray를 반환하기 때문에 저장 및 복원에 사용하는 코드를 확인합니다. –

+1

예, DockWidgets를 만들고 각각의 고유 이름을 가진 setObjectName (name)을 호출합니다. 저장은 현재 settings-> setValue ("mainwindow/state", this-> saveState());로 수행됩니다. QByteArray를 ini에 기록하기 전에 QByteArray를 인코딩/디코딩해야합니까? 나는 문서에서와 같은 코드를 사용했다. 내 툴바의 크기와 위치가 매번 저장되고로드되므로 매번 사용자 지정 DockWidgets가 복원되지 않을 것이라고 생각합니다 (저장 여부를 확인하는 방법을 모르겠습니다). – Tobias

1

이미 해결 질문 2 :
매우 쉽습니다 .. QList < QDockWidget * > dockWidgetList = findChildren < QDockWidget * >();
로드 된 위젯이 없으므로로드 후 목록이 현재 비어 있습니다.)

1

를 참조, 복사 생성자가 없어야합니다 - (? 어쨌든 할 수있는 방법) 당신의 독 위젯을 다시하지 않을 것이다 자신의 위치와 상태 (숨김, 자유 또는 고정)를 복원합니다. restoreState를 호출하기 전에 수동으로 도크 위젯을 만들어야합니다.

+0

좋습니다, 감사합니다. ! 이 위젯을 어떤 식 으로든 직렬화하거나 자동으로 다시 만들 수있는 클래스를 저장할 수 있다고 생각했습니다. 그래서 나 자신을 위해 열려있는 모든 DockWidgets의 목록을 저장하고 Startup에서 상응하는 DockWidgets를 다시 생성해야만 restoreState()를 호출 할 수있다. – Tobias