2012-06-03 2 views
0

다른 기능을 사용하기 위해 여러 개의 누적 창을 만드는 프로그램에서 작업하고 있습니다. 이 창은 별도의 클래스로 만들어집니다. 스택 된 윈도우 중 하나는 여러 개의 도킹을 보유하고 있으며이를 표시하거나 숨기려면 윈도우 메뉴에서 토글 가능하도록하고 싶습니다. 메인 윈도우 클래스의 일부이지만 파일이 크다면이 작업을 수행 할 수 있습니다. 내 문제는 메인 윈도우가 이미 레이아웃을 가지고 있기 때문에 에디터 클래스가 메인 윈도우를 상속받을 때 레이아웃을 표시 할 수없는 것처럼 보일 수 있다는 것이다. 그리고 컴파일러는 여전히 메뉴에 액션을 추가하는 줄에 오류를 던지고있었습니다. 아무도 내가 별도의 클래스에서 이들을 어떻게 유지할 수 있는지에 대한 제안을 가지고 있지만 여전히 mainwindow 클래스의 private 멤버를 사용할 수 있습니다. 고급 도움말에 감사드립니다! 에디터 페이지는 다른보기 상태 레이아웃은 뷰 클래스 헤더 파일의Mainwindows에 액세스하는 적절한 방법 다른 클래스의 개인 변수

EditorPage::EditorPage(QWidget *parent) : QWidget(parent) 
{ 
mdiArea = new QMdiArea; 
mdiToolBox = new QToolBox; 

QDockWidget *dock = new QDockWidget(tr("SQL Manager")); 
//MainWindow::windowMenu->addAction(dock->toggleViewAction()); 
//MainWindow::windowMenu->addAction(dock->toggleViewAction()); 

QDockWidget *dock1 = new QDockWidget(tr("SQL Manager")); 

QSplitter *splitter = new QSplitter(); 
splitter->setOrientation(Qt::Vertical); 
splitter->addWidget(mdiArea); 
splitter->addWidget(dock); 

QSplitter *splitter1 = new QSplitter(); 
splitter1->setOrientation(Qt::Horizontal); 
splitter1->addWidget(dock1); 
splitter1->addWidget(splitter); 

QHBoxLayout *mainLayout = new QHBoxLayout(); 
mainLayout->addWidget(splitter1); 
mainLayout->setSpacing(0); 
mainLayout->setMargin(0); 
setLayout(mainLayout); 

} 

파트를 저장하는 뷰 소스 페이지의

MainWindow::MainWindow(QWidget *parent) 
{ 
createActions(); 
createMenu(); 
createStatusBar(); 
createDocks(); 

createMainWidget(); 

readSettings(); 

setWindowTitle("Black Ops Bsuiness Group's ERP System - Version 0.0.0.1"); 
} 

void MainWindow::createMainWidget() 
{ 
contentsIconWidget = new QListWidget(); 
contentsIconWidget->setViewMode(QListView::IconMode); 
contentsIconWidget->setIconSize(QSize(70,70)); 
contentsIconWidget->setMovement(QListView::Static); 
contentsIconWidget->setMaximumWidth(75); 
contentsIconWidget->setMinimumWidth(75); 
contentsIconWidget->setSpacing(10); 
contentsIconWidget->setStyleSheet("QListWidget {background-color:#333; color:#0099FF;}"); 

mainContentPages = new QStackedWidget(); 
mainContentPages->addWidget(new HomePage); 
mainContentPages->addWidget(new AnalyticsPage); 
mainContentPages->addWidget(new EditorPage); 
mainContentPages->setStyleSheet("QStackedWidget {border:1px solid #888;}"); 
setCentralWidget(mainContentPages); 

createIcons(); 
contentsIconWidget->setCurrentRow(0); 

QHBoxLayout *hMainLayout = new QHBoxLayout(); 
hMainLayout->addWidget(contentsIconWidget,0); 
hMainLayout->addWidget(mainContentPages,0); 
hMainLayout->setSpacing(0); 
hMainLayout->setMargin(0); 

QFrame *mFrame = new QFrame(this); 
mFrame->setLayout(hMainLayout); 
setCentralWidget(mFrame); 
} 

부분이라고 메인 윈도우의

class EditorPage : public QWidget 
{ 
public: 
EditorPage(QWidget *parent = 0); 

private: 
QMdiArea *mdiArea; 
QToolBox *mdiToolBox; 
}; 

답변

1

Qt 방식은 signals and slots을 사용하는 것입니다.

toggleDock() 슬롯을 얻을 것입니다 (아마도 int 또는 열거 값을 복용), 메인 창 중 하나를 사용자 정의 신호, QAction에 의해 트리거 무엇인가, 또는 버튼 위젯에서 (신호를 통해 해당 슬롯을 호출 할 것입니다 귀하의 편집기 창).

이렇게하면 클래스간에 정적 종속성이 없습니다.

(아마도) 배열 (회원으로 도크 위젯에 대한 포인터를 저장하는 것 코드에이 쉽게 만들 않습니다.)

+0

나는 이해 생각합니다. 선창을 만들 때 액션을 만들려고하는 대신 다른 클래스의 선창 모양을 제어하는 ​​기본 창을 만들 때 신호로 액션을 만들어야합니다. 미안하지만 저처럼 보일지에 대한 빠른 예를 보여줄 수 있다고 생각하니? 나는 그런 것을 시도했지만 나는 그것을 작동시키지 못했습니다. 고마워 btw ... 나는 그것을 작동시킬 때 그것을 확인합니다. – Rob

+0

[텍스트 편집기] (http://qt-project.org/doc/qt-4.8/gettingstartedqt.html) 자습서는 맞춤 슬롯을 만들고 연결하는 데 도움이되는 유용한 자료입니다. 슬롯이 에디터 클래스에 있고, 메인 윈도우가 액션 신호 중 하나를 에디터의 슬롯에 연결한다는 점을 제외하면 정확히 필요합니다. – Mat

관련 문제