Qt中 QDockWidget的自定义标题栏 以及 tab页的位置

来源:互联网 发布:淘宝一元秒杀网在那 编辑:程序博客网 时间:2024/06/05 00:16

原文转载于:https://www.oschina.net/code/snippet_1029551_20242

代码片段(8)[全屏查看所有代码]

1. [代码]myDockTitleBar.h     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef MYDOCKTITLEBAR_H
#define MYDOCKTITLEBAR_H
 
#include <QSize>
#include <QDockWidget>
#include <QMouseEvent>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include "qdebug.h"
#include <QStyle>
 
classMyDockTitleBar : publicQWidget
{
    Q_OBJECT
public:
    MyDockTitleBar(QWidget *parent = 0);
 
    QSize sizeHint() const{ returnminimumSizeHint(); }
    QSize minimumSizeHint() const;
 
protected:
    voidpaintEvent(QPaintEvent *event);
    voidmousePressEvent(QMouseEvent *event);
 
publicslots:
    voidupdateMask();
 
private:
    QPixmap minPix, closePix, floatPix;
 
};
 
 
#endif // MYDOCKTITLEBAR_H

2. [代码]myDockTitleBar.cpp     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "myDockTitleBar.h"
 
MyDockTitleBar::MyDockTitleBar(QWidget *parent)
    : QWidget(parent)
{
    minPix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);
    closePix  = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
    floatPix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);
}
 
QSize MyDockTitleBar::minimumSizeHint() const
{
    QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
    Q_ASSERT(dw != 0);
    QSize result(200, 35);
    if(dw->features() & QDockWidget::DockWidgetVerticalTitleBar)
        result.transpose();
    returnresult;
}
 
voidMyDockTitleBar::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QRect rect = this->rect();
 
    QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
    Q_ASSERT(dw != 0);
 
    if(dw->features() & QDockWidget::DockWidgetVerticalTitleBar) {
        QSize s = rect.size();
        s.transpose();
        rect.setSize(s);
 
        painter.translate(rect.left(), rect.top() + rect.width());
        painter.rotate(-90);
        painter.translate(-rect.left(), -rect.top());
    }
 
    painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(tr("white")));
    painter.drawPixmap(rect.topRight() - QPoint(closePix.width() + 10, -10), closePix);
    painter.drawPixmap(rect.topRight() - QPoint(minPix.width() + 10 + closePix.width() + 10, -7), minPix);
    painter.drawPixmap(rect.topRight() - QPoint(floatPix.width() + 10 + minPix.width() + 10
                                                + closePix.width() + 10, -10), floatPix);
}
 
voidMyDockTitleBar::mousePressEvent(QMouseEvent *event)
{
    QPoint pos = event->pos();
 
    QRect rect = this->rect();
 
    QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
    Q_ASSERT(dw != 0);
 
    if(dw->features() & QDockWidget::DockWidgetVerticalTitleBar) {
        QPoint p = pos;
        pos.setX(rect.left() + rect.bottom() - p.y());
        pos.setY(rect.top() + p.x() - rect.left());
 
        QSize s = rect.size();
        s.transpose();
        rect.setSize(s);
    }
 
    constint buttonRight = 10;
    constint buttonWidth = 20;
    intright = rect.right() - pos.x();
    intbutton = (right - buttonRight)/buttonWidth;
 
    qDebug() << rect.right() << " --- " << pos.x() << " --- " << right << " --- " << button;
 
    switch(button) {
    case0:
        event->accept();
        dw->close();
        break;
    case1:
        event->accept();
        dw->setFloating(!dw->isFloating());
        break;
    case2: {
        event->accept();
        QDockWidget::DockWidgetFeatures features = dw->features();
        if(features & QDockWidget::DockWidgetVerticalTitleBar)
            features &= ~QDockWidget::DockWidgetVerticalTitleBar;
        else
            features |= QDockWidget::DockWidgetVerticalTitleBar;
        dw->setFeatures(features);
        break;
    }
    default:
        event->ignore();
        break;
    }
}
 
voidMyDockTitleBar::updateMask()
{
    //    QDockWidget *dw = qobject_cast<QDockWidget*>(parent());
    //    Q_ASSERT(dw != 0);
 
    //    QRect rect = dw->rect();
    //    QPixmap bitmap(dw->size());
 
    //    {
    //        QPainter painter(&bitmap);
 
    //        ///initialize to transparent
    //        painter.fillRect(rect, Qt::color0);
 
    //        QRect contents = rect;
    //        contents.setTopLeft(geometry().bottomLeft());
    //        contents.setRight(geometry().right());
    //        contents.setBottom(contents.bottom()-y());
    //        painter.fillRect(contents, Qt::color1);
 
 
 
    //        //let's pait the titlebar
 
    //        QRect titleRect = this->geometry();
 
    //        if (dw->features() & QDockWidget::DockWidgetVerticalTitleBar) {
    //            QSize s = rect.size();
    //            s.transpose();
    //            rect.setSize(s);
 
    //            QSize s2 = size();
    //            s2.transpose();
    //            titleRect.setSize(s2);
 
    //            painter.translate(rect.left(), rect.top() + rect.width());
    //            painter.rotate(-90);
    //            painter.translate(-rect.left(), -rect.top());
    //        }
 
    //        contents.setTopLeft(titleRect.bottomLeft());
    //        contents.setRight(titleRect.right());
    //        contents.setBottom(rect.bottom()-y());
 
    //        QRect rect = titleRect;
 
 
    //        painter.drawPixmap(rect.topLeft(), leftPm.mask());
    //        painter.fillRect(rect.left() + leftPm.width(), rect.top(),
    //                         rect.width() - leftPm.width() - rightPm.width(),
    //                         centerPm.height(), Qt::color1);
    //        painter.drawPixmap(rect.topRight() - QPoint(rightPm.width() - 1, 0), rightPm.mask());
 
    //        painter.fillRect(contents, Qt::color1);
    //    }
 
    //    dw->setMask(bitmap);
}

3. [代码]mainwindow.h     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QWidget>
 
namespaceUi {
classMainWindow;
}
 
classMainWindow : publicQMainWindow
{
    Q_OBJECT
     
public:
    explicitMainWindow(QWidget *parent = 0);
    ~MainWindow();
     
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H

4. [代码]mainwindow.cpp     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myDockTitleBar.h"
 
#include <QDockWidget>
#include <QToolButton>
#include <QPushButton>
#include <QVBoxLayout>
#include <QMdiSubWindow>
#include <QFrame>
#include <QDebug>
 
#include <QPainter>
#include <QMouseEvent>
#include <QBitmap>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(newUi::MainWindow)
{
    ui->setupUi(this);
 
    QDockWidget *testDock = newQDockWidget(tr("Test Dock"));
    testDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable
                          | QDockWidget::DockWidgetMovable);
    testDock->setMinimumWidth(200);
    testDock->setStyleSheet(tr("background-color:green;"));
 
    MyDockTitleBar *titlebar1 = newMyDockTitleBar(testDock);
    testDock->setTitleBarWidget(titlebar1);
 
    QWidget *testWidget = newQWidget;
    QVBoxLayout *box = newQVBoxLayout;
 
    QPushButton *okButton = newQPushButton(tr("Ok"));
    okButton->setStyleSheet(tr("background-color:white;"));
    box->addWidget(okButton);
    testWidget->setLayout(box);
 
    testDock->setWidget(testWidget);
 
    //////////////////////////////////////////////////////////
 
    QDockWidget *testDock2 = newQDockWidget(tr("Test Dock2"));
    testDock2->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable
                           | QDockWidget::DockWidgetMovable);
    testDock2->setMinimumWidth(200);
    testDock2->setStyleSheet(tr("background-color:orange;"));
 
    MyDockTitleBar *titlebar2 = newMyDockTitleBar(testDock2);
    testDock2->setTitleBarWidget(titlebar2);
 
    QWidget *testWidget2 = newQWidget;
    QVBoxLayout *box2 = newQVBoxLayout;
 
    QPushButton *okButton2 = newQPushButton(tr("Ok"));
    okButton2->setStyleSheet(tr("background-color:white;"));
    box2->addWidget(okButton2);
    testWidget2->setLayout(box2);
 
    testDock2->setWidget(testWidget2);
 
    //////////////////////////////////////////////////////////
 
    this->addDockWidget(Qt::LeftDockWidgetArea, testDock);
 
    this->setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::West);
    this->tabifyDockWidget(testDock, testDock2);
}
 
MainWindow::~MainWindow()
{
    deleteui;
}

5. [代码]main.cpp     

?
1
2
3
4
5
6
7
8
9
10
11
12
#include "mainwindow.h"
#include <QApplication>
 
 
intmain(intargc, char*argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
     
    returna.exec();
}

6. [代码]testDock.pro     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#-------------------------------------------------
#
# Project created by QtCreator 2013-04-08T12:59:04
#
#-------------------------------------------------
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = testDock
TEMPLATE = app
 
 
SOURCES += main.cpp\
        mainwindow.cpp \
    myDockTitleBar.cpp
 
HEADERS  += mainwindow.h \
    myDockTitleBar.h
 
FORMS    += \
    mainwindow.ui

7. [代码]mainwindow.ui     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0"encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widgetclass="QMainWindow"name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>640</width>
    <height>480</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widgetclass="QWidget"name="centralwidget"/>
  <widgetclass="QMenuBar"name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widgetclass="QStatusBar"name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

8. [图片] testDock.png