2012-06-03 78 views
0

我正在創建一個程序,我創建了幾個堆疊的窗口來處理不同的功能。這些窗口是在他們自己分離的類中創建的。其中一個堆疊的窗口擁有多個碼頭,我想讓它們可以從窗口菜單切換以顯示或隱藏它們。我可以做到這一點,如果他們是主窗口類的一部分,但然後該文件是巨大的。我的問題是,當編輯器類繼承主窗口時,我似乎無法使佈局顯示出來,因爲主窗口已經有佈局。即使如此,編譯器仍然在向菜單添加操作的行中發生錯誤。有沒有人對我如何將它們保存在單獨的類中有任何建議,但仍然能夠使用mainwindow類的私有成員。感謝您的高級幫助!正確的方法訪問Mainwindows從另一個類的私有變量

主窗口的一部分,其中編輯器頁稱爲

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); 
} 

視圖源頁面的部分,其中不同視圖狀態的佈局被存儲頭文件的

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); 

} 

部分爲視圖類

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

相關問題