QDockWidget類詳解
【詳細描述】
QDockWidget類提供了一個特殊的窗口部件,它可以是被鎖在QMainWindow窗口內部或者是作爲頂級窗口懸浮在桌面上。QDockWidget類提供了dock widget的概念,dock widget也就是我們熟悉的工具面板或者是工具窗口。Dock window是放置在
QMindow窗口周圍的dock widget區域中的。
如下圖所示:
可以被放置的區域。
【外觀】
一個QDockWidget包含一個小的工具欄和內容區域。小的工具欄用於顯示窗口標題,一個浮動按鈕和一個關閉按鈕。取決於QDockWidget的狀態,浮動按鈕和關閉按鈕可能或者禁止或者完全不顯示。
工具欄和按鈕的顯示取決於你所使用的樣式。
QDockWidget可以作爲它子窗口部件的封裝,通過setWidget()設置子窗口部件。自定義的尺寸提示,最小和最大化尺寸已經尺寸策略都必須由子窗口部件來實現。QDockWidget會遵守它們,調整它自己的限制包括框架和工具欄。我們不應該爲QDockWidget設置尺寸限制,因爲它們根據QDockWidget是否鎖住而改變,一個鎖住的QDockWidget窗口部件不包括框架和小的工具欄。
【類詳解】
1、QDockWidget對象包含一些特性,例如:移動、懸浮、關閉等等,這些都是枚舉類型:
2、QDockWidget可以放置的位置,也是枚舉類型:
3、成員函數:void QDockWidget::setTitleBarWidget(QWidget * widget)
設置任意的widget作爲dock widget的工具欄。如果widget設置爲0,那麼之前在dock widget上設置的任意自定義工具欄都會被清除,但是不是刪除,並且會使用默認的工具欄。
如果我們爲工具欄設置了widget,那麼當它懸浮的時候,QDockWidget不會使用本地窗口裝飾它。
下面是對實現自定義的工具欄的一些建議:
*那些不是明確由工具欄處理的鼠標事件應該通過調用QMouseEvent::ignore()函數忽略掉。這些事件就會傳遞給QDockWidget,由
QDockWidget按照常規的方式處理。拖動鼠標的時候就移動,雙擊的時候就鎖住/解鎖等等。
*當爲QDockWidget設置了DockWidgetVerticalTitleBar時,那麼工具欄窗口部件就會相應的放置在新的位置上。在resizeEvent()中
,工具欄必須檢查放置的方向:
QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget());
if (dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar) {
// I need to be vertical
} else {
// I need to be horizontal
}
*工具欄widget必須包含有合法的QWidget::sizeHint()和QWidget::minimumSizeHint()。這些方法必須考慮工具欄放置的方向。
*從一個鎖定的widget中移除工具欄是不可能的。然而,我們可以通過將默認構造的QWidget作爲工具欄widget來達到這種效果。
4、成員函數:void QDockWidget::setWidget(QWidget * widget)
當widget添加的時候,如果dock widget是可見的,那麼你就需要顯示的調用show()函數。
在調用這個函數之前,你必須先添加widget的佈局,否則,添加的widget就是不可見的。
【示例1】
{效果}
{實現}
【示例2】
{效果}
{實現}
這裏的dockwidget較之前的要豐富得多,是因爲自定義了類ColorSwatch,該類繼承自QDockWidget:
class ColorSwatch : public QDockWidget
{
Q_OBJECT
QAction *closableAction;
QAction *movableAction;
QAction *floatableAction;
QAction *floatingAction;
QAction *verticalTitleBarAction;
QActionGroup *allowedAreasActions;
QAction *allowLeftAction;
QAction *allowRightAction;
QAction *allowTopAction;
QAction *allowBottomAction;
QActionGroup *areaActions;
QAction *leftAction;
QAction *rightAction;
QAction *topAction;
QAction *bottomAction;
QAction *changeSizeHintsAction;
QMenu *tabMenu;
QMenu *splitHMenu;
QMenu *splitVMenu;
QAction *windowModifiedAction;
public:
explicit ColorSwatch(const QString &colorName, QWidget *parent = 0, Qt::WindowFlags flags = 0);
QMenu *menu;
void setCustomSizeHint(const QSize &size);
protected:
virtual void contextMenuEvent(QContextMenuEvent *event);
virtual void resizeEvent(QResizeEvent *e);
private:
void allow(Qt::DockWidgetArea area, bool allow);
void place(Qt::DockWidgetArea area, bool place);
private slots:
void changeClosable(bool on);
void changeMovable(bool on);
void changeFloatable(bool on);
void changeFloating(bool on);
void changeVerticalTitleBar(bool on);
void updateContextMenu();
void allowLeft(bool a);
void allowRight(bool a);
void allowTop(bool a);
void allowBottom(bool a);
void placeLeft(bool p);
void placeRight(bool p);
void placeTop(bool p);
void placeBottom(bool p);
void splitInto(QAction *action);
void tabInto(QAction *action);
};
我們來看看它的構造函數:
explicit ColorSwatch(const QString &colorName, QWidget *parent = 0, Qt::WindowFlags flags = 0);
這裏我們比較關注的是第一個參數,dockwidget的顏色,這一點從前面的運行效果也可以看出來,然後比較關注的就是第三個參數,主要設置QDockWidget的一些標誌,我們可以看看它的實例化:
再來看看在自定義的類中定義了不少QAction,這些是上下文菜單中使用的,如下圖,具體的使用方式就是根據QDockWidget的features()函數判斷某些特性是否選中:
最後,我們還是用了之前介紹QDockWidget類時重點提到的兩個函數:
(1)setWidget()
(2)setTitleBarWidget()
參考:
(1)http://qt-project.org/doc/qt-5.0/qtwidgets/qdockwidget.html
(2)http://qt-project.org/doc/qt-5.0/qtwidgets/mainwindows-dockwidgets.html
(3)http://qt-project.org/doc/qt-5.0/qtwidgets/mainwindows-mainwindow.html