6.5 可停靠控制元件及工具欄(Dock Widgets and Toolbars)

pamxy發表於2013-06-24

轉自:http://zlhwhj.blog.163.com/blog/static/2539003420081251140541/

可停靠控制元件能夠停靠在QMainWindow中或者作為一個獨立視窗浮動。QMainWindow提供了四個可停靠控制元件的地方:位於中央控制元件的上方,下方,左方,右方。Microsoft Visual Stadio程式和Qt Linguist程式使用大量的可停靠視窗實現更為靈活的使用者介面。在Qt中,可停靠視窗是QDockWidget的一個例項。
Figure 6.13. A QMainWindow with a dock widget
  
每一個可停靠控制元件都有一個標題條,甚至當它停靠時。使用者可以拖動標題欄把視窗從一個可停靠區域移動到另一個可停靠區域。拖動標題欄把視窗移動到不能停靠的區域,視窗就浮動為一個獨立的視窗。自由浮動的視窗總是在主視窗的上面。使用者點選標題欄上的關閉按鈕可以關閉QDockWidget。呼叫QDockWidget::setFeatures()能夠禁止這些特性。
在Qt的早期版本中,工具條也是作為可停靠控制元件,可以放置在任何可停靠區域中。從Qt4開始,工具條有了自己的位置,不能再浮動了,如果需要一個可停靠的工具條,我們可以把它放到QDockWindow裡面。
Figure 6.14. QMainWindow's dock and toolbar areas
 
用點線表示的四個角落可以屬於任何一個相鄰的可停靠區域。例如,呼叫QMainWindow::setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea)把左上角作為左側的停靠區域。
下面的程式碼將一個現有的控制元件(如QTreeWidget)放置到QDockWidget中,插入它在右邊的停靠區域。
QDockWidget *shapesDockWidget = new QDockWidget(tr("Shapes"));
shapesDockWidget->setWidget(treeWidget);
shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea
                                  | Qt::RightDockWidgetArea);
addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget);
 
函式setAllowAreas()確定控制元件可停靠的位置。在上面的程式碼允許使用者把可停靠控制元件拖動到左邊或者右邊的可停靠區域,這兩個地方有垂直空間足夠顯示一個樹型控制元件。如果沒有指定停靠區域,使用者可以拖動控制元件到任何四個可停靠的區域。
 
下面的程式碼建立一個工具欄,包含一個QComboBox,QSpinBox和一些QToolButton,程式碼為QMainWindow子類的建構函式的一部分:
QToolBar *fontToolBar = new QToolBar(tr("Font"));
fontToolBar->addWidget(familyComboBox);
fontToolBar->addWidget(sizeSpinBox);
fontToolBar->addAction(boldAction);
fontToolBar->addAction(italicAction);
fontToolBar->addAction(underlineAction);
fontToolBar->setAllowedAreas(Qt::TopToolBarArea
                             | Qt::BottomToolBarArea);
addToolBar(fontToolBar);
 
如果我們需要在下一次執行程式時恢復所有可停靠控制元件和工具欄的位置, 採用QMainWindow's saveState() 和restoreState()函式,可以使用與儲存QSplitter狀態相似的程式碼:
 
void MainWindow::writeSettings()
{
    QSettings settings("Software Inc.", "Icon Editor");
    settings.beginGroup("mainWindow");
    settings.setValue("size", size());
    settings.setValue("state", saveState());
    settings.endGroup();
}
void MainWindow::readSettings()
{
    QSettings settings("Software Inc.", "Icon Editor");
    settings.beginGroup("mainWindow");
    resize(settings.value("size").toSize());
    restoreState(settings.value("state").toByteArray());
    settings.endGroup();
}
 
QMainWindow提供了一個上下文選單,列出了所有可停靠的視窗和工具欄。使用者可以通過這個選單關閉和顯示停靠視窗和隱藏和恢復顯示工具欄。
Figure 6.15. A QMainWindow context menu

相關文章