QDockWidget詳解

                                                    QDockWidget類詳解

【詳細描述】

QDockWidget類提供了一個特殊的窗口部件,它可以是被鎖在QMainWindow窗口內部或者是作爲頂級窗口懸浮在桌面上。
QDockWidget類提供了dock widget的概念,dock widget也就是我們熟悉的工具面板或者是工具窗口。Dock window是放置在
QMindow窗口周圍的dock widget區域中的。

如下圖所示:


Dock windows可以在幾個區域中移動,或者是懸浮。該類提供的API允許程序員限制dock widgets的移動,懸浮和關閉,以及它
可以被放置的區域。

【外觀】

一個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章