QtCanpool 3.3.0
载入中...
搜索中...
未找到
docktab.cpp
浏览该文件的文档.
1
6#include "docktab.h"
7#include "dockwidget.h"
8#include "dockpanel.h"
9#include "docklabel.h"
10#include "dockmanager.h"
11#include "dockutils.h"
13#include "dockfloatingpreview.h"
14#include "dockcontainer.h"
15#include "dockwindow.h"
16#include "dockoverlay.h"
17#include "dockfocuscontroller.h"
18
19#include <QBoxLayout>
20#include <QToolButton>
21#include <QPushButton>
22#include <QMouseEvent>
23#include <QApplication>
24#include <QLabel>
25#include <QMenu>
26#include <QAction>
27
29
30class DockTabPrivate
31{
32public:
33 QX_DECLARE_PUBLIC(DockTab)
34public:
35 DockTabPrivate();
36 void init();
37
38 bool testConfigFlag(DockManager::ConfigFlag flag) const;
39 QAbstractButton *createCloseButton() const;
40 void updateCloseButtonSizePolicy();
41 void updateCloseButtonVisibility(bool active);
42
43 void saveDragStartMousePosition(const QPoint &globalPos);
44 bool isDraggingState(Qx::DockDragState dragState) const;
45 void moveTab(QMouseEvent *e);
46 bool startFloating(Qx::DockDragState draggingState = Qx::DockDraggingFloatingWidget);
47
48 template <typename T> DockFloatingWidget *createFloatingWidget(T *widget, bool needCreateContainer);
49 DockFocusController *focusController() const;
50
51 void updateIcon();
52 QAction *createAutoHideToAction(const QString &title, Qx::DockSideBarArea area, QMenu *menu);
53public:
54 DockWidget *m_dockWidget = nullptr;
55 DockPanel *m_panel = nullptr;
56 DockLabel *m_label = nullptr;
57 QLabel *m_iconLabel = nullptr;
58 QAbstractButton *m_closeButton = nullptr;
59 QIcon m_icon;
60 QSize m_iconSize;
61 bool m_isActive = false;
62
63 QPoint m_globalDragStartMousePosition;
64 QPoint m_dragStartMousePosition;
65 QPoint m_tabDragStartPosition;
67 DockFloatingWidget *m_floatingWidget = nullptr;
68};
69
70DockTabPrivate::DockTabPrivate()
71{
72}
73
74void DockTabPrivate::init()
75{
76 Q_Q(DockTab);
77
78 m_label = new DockLabel();
79 if (DockManager::testConfigFlag(DockManager::DisableTabTextEliding)) {
80 m_label->setElideMode(Qt::ElideNone);
81 } else {
82 m_label->setElideMode(Qt::ElideRight);
83 }
84 m_label->setText(m_dockWidget->windowTitle());
85 m_label->setObjectName("dockTabLabel");
86 m_label->setAlignment(Qt::AlignCenter);
87 q->connect(m_label, SIGNAL(elidedChanged(bool)), SIGNAL(elidedChanged(bool)));
88
89 m_closeButton = createCloseButton();
90 m_closeButton->setObjectName("dockTabCloseButton");
91 internal::setButtonIcon(m_closeButton, QStyle::SP_TitleBarCloseButton, Qx::DockTabCloseIcon);
92 m_closeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
93 m_closeButton->setFocusPolicy(Qt::NoFocus);
94 updateCloseButtonSizePolicy();
95 internal::setToolTip(m_closeButton, QObject::tr("Close Tab"));
96 // DockTab and DockWidget are partners. When a DockWidget is created, a DockTab is created.
97 // The associated DockTab can be obtained through the tab() interface of the DockWidget.
98 // closeButton -> clicked()
99 // DockTab -> closeRequested()
100 // DockTabBar -> onTabCloseRequested() -> tabCloseRequested(index)
101 // DockPanel -> onTabCloseRequested(index)
102 // DockWidget -> requestCloseDockWidget()
103 q->connect(m_closeButton, SIGNAL(clicked()), SIGNAL(closeRequested()));
104
105 QFontMetrics fm(m_label->font());
106 int spacing = qRound(fm.height() / 4.0);
107
108 // Fill the layout
109 QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight);
110 layout->setContentsMargins(2 * spacing, 0, 0, 0);
111 layout->setSpacing(0);
112 q->setLayout(layout);
113
114 layout->addWidget(m_label, 1);
115 layout->addSpacing(spacing);
116 layout->addWidget(m_closeButton);
117 layout->addSpacing(qRound(spacing * 4.0 / 3.0));
118 layout->setAlignment(Qt::AlignCenter);
119
120 m_label->setVisible(true);
121}
122
126bool DockTabPrivate::testConfigFlag(DockManager::ConfigFlag flag) const
127{
128 return DockManager::testConfigFlag(flag);
129}
130
131QAbstractButton *DockTabPrivate::createCloseButton() const
132{
133 if (testConfigFlag(DockManager::TabCloseButtonIsToolButton)) {
134 auto b = new QToolButton();
135 b->setAutoRaise(true);
136 return b;
137 } else {
138 return new QPushButton();
139 }
140}
141
142void DockTabPrivate::updateCloseButtonSizePolicy()
143{
144 auto features = m_dockWidget->features();
145 auto sizePolicy = m_closeButton->sizePolicy();
146 sizePolicy.setRetainSizeWhenHidden(features.testFlag(DockWidget::DockWidgetClosable) &&
147 testConfigFlag(DockManager::RetainTabSizeWhenCloseButtonHidden));
148 m_closeButton->setSizePolicy(sizePolicy);
149}
150
151void DockTabPrivate::updateCloseButtonVisibility(bool active)
152{
153 bool dockWidgetClosable = m_dockWidget->features().testFlag(DockWidget::DockWidgetClosable);
154 bool activeTabHasCloseButton = testConfigFlag(DockManager::ActiveTabHasCloseButton);
155 bool allTabsHaveCloseButton = testConfigFlag(DockManager::AllTabsHaveCloseButton);
156 bool tabHasCloseButton = (activeTabHasCloseButton && active) || allTabsHaveCloseButton;
157 m_closeButton->setVisible(dockWidgetClosable && tabHasCloseButton);
158}
159
160void DockTabPrivate::saveDragStartMousePosition(const QPoint &globalPos)
161{
162 Q_Q(DockTab);
163 m_globalDragStartMousePosition = globalPos;
164 m_dragStartMousePosition = q->mapFromGlobal(globalPos);
165}
166
167bool DockTabPrivate::isDraggingState(Qx::DockDragState dragState) const
168{
169 return m_dragState == dragState;
170}
171
175void DockTabPrivate::moveTab(QMouseEvent *e)
176{
177 Q_Q(DockTab);
178 e->accept();
179 QPoint distance = internal::globalPositionOf(e) - m_globalDragStartMousePosition;
180 distance.setY(0);
181 auto targetPos = distance + m_tabDragStartPosition;
182 targetPos.rx() = qMax(targetPos.x(), 0);
183 targetPos.rx() = qMin(q->parentWidget()->rect().right() - q->width() + 1, targetPos.rx());
184 q->move(targetPos);
185 q->raise();
186}
187
193bool DockTabPrivate::startFloating(Qx::DockDragState draggingState)
194{
195 Q_Q(DockTab);
196 auto container = m_dockWidget->dockContainer();
197 QX_DOCK_PRINT("----");
198 QX_DOCK_PRINT("isFloating " << container->isFloating());
199 QX_DOCK_PRINT("panelCount " << container->dockPanelCount());
200 QX_DOCK_PRINT("visiblePanelCount " << container->visibleDockPanelCount());
201 QX_DOCK_PRINT("widgetCount " << m_dockWidget->dockPanel()->dockWidgetsCount());
202 // if this is the last dock widget inside of this floating widget,
203 // then it does not make any sense to make it floating because
204 // it is already floating
205 if (container->isFloating() && (container->visibleDockPanelCount() == 1) &&
206 (m_dockWidget->dockPanel()->dockWidgetsCount() == 1)) {
207 return false;
208 }
209
210 QX_DOCK_PRINT("dragginState " << draggingState);
211 m_dragState = draggingState;
212 DockFloatingWidget *floatingWidget = nullptr;
213 bool needCreateContainer = (Qx::DockDraggingFloatingWidget != draggingState);
214
215 // If panel has multiple tabs, we take only one tab.
216 // If it has only one single tab, we can move the complete
217 // dock panel into floating widget
218 QSize size;
219 if (m_panel->dockWidgetsCount() > 1) {
220 floatingWidget = createFloatingWidget(m_dockWidget, needCreateContainer);
221 size = m_dockWidget->size();
222 } else {
223 floatingWidget = createFloatingWidget(m_panel, needCreateContainer);
224 size = m_panel->size();
225 }
226
227 if (Qx::DockDraggingFloatingWidget == draggingState) {
228 floatingWidget->startFloating(m_dragStartMousePosition, size, Qx::DockDraggingFloatingWidget, q);
229 auto window = m_dockWidget->dockWindow();
230 auto overlay = window->containerOverlay();
231 overlay->setAllowedAreas(Qx::OuterDockAreas);
232 this->m_floatingWidget = floatingWidget;
233 qApp->postEvent(m_dockWidget, new QEvent((QEvent::Type)internal::DockedWidgetDragStartEvent));
234 } else {
235 floatingWidget->startFloating(m_dragStartMousePosition, size, Qx::DockDraggingInactive, nullptr);
236 }
237
238 return true;
239}
240
241DockFocusController *DockTabPrivate::focusController() const
242{
243 return m_dockWidget->dockWindow()->dockFocusController();
244}
245
246void DockTabPrivate::updateIcon()
247{
248 Q_Q(DockTab);
249 if (!m_iconLabel || m_icon.isNull()) {
250 return;
251 }
252
253 if (m_iconSize.isValid()) {
254 m_iconLabel->setPixmap(m_icon.pixmap(m_iconSize));
255 } else {
256 m_iconLabel->setPixmap(m_icon.pixmap(q->style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, q)));
257 }
258 m_iconLabel->setVisible(true);
259}
260
261QAction *DockTabPrivate::createAutoHideToAction(const QString &title, Qx::DockSideBarArea area, QMenu *menu)
262{
263 Q_Q(DockTab);
264 auto action = menu->addAction(title);
265 action->setProperty(internal::LocationProperty, area);
266 QObject::connect(action, &QAction::triggered, q, &DockTab::onAutoHideToActionClicked);
267 return action;
268}
269
270template <typename T> DockFloatingWidget *DockTabPrivate::createFloatingWidget(T *widget, bool needCreateContainer)
271{
272 Q_Q(DockTab);
273 if (needCreateContainer) {
274 return new DockFloatingContainer(widget);
275 } else {
276 auto w = new DockFloatingPreview(widget);
277 q->connect(w, &DockFloatingPreview::draggingCanceled, [=]() {
278 m_dragState = Qx::DockDraggingInactive;
279 });
280 return w;
281 }
282}
283
284/* DockTab */
285DockTab::DockTab(DockWidget *w, QWidget *parent)
286 : Super(parent)
287{
289
290 Q_D(DockTab);
291 d->m_dockWidget = w;
292 d->init();
293
294 setAttribute(Qt::WA_NoMousePropagation, true);
295 setFocusPolicy(Qt::NoFocus);
296}
297
303
305{
306 Q_D(const DockTab);
307 return d->m_isActive;
308}
309
310void DockTab::setActive(bool active)
311{
312 Q_D(DockTab);
313 d->updateCloseButtonVisibility(active);
315 if (active) {
316 d->m_label->setVisible(true);
317 } else {
318 d->m_label->setVisible(false);
319 }
320 }
321 // Focus related stuff
323 !d->m_dockWidget->dockWindow()->isRestoringState()) {
324 bool updateFocusStyle = false;
325 if (active && !hasFocus()) {
326 // setFocus(Qt::OtherFocusReason);
327 d->focusController()->setDockWidgetTabFocused(this);
328 updateFocusStyle = true;
329 }
330
331 if (d->m_isActive == active) {
332 if (updateFocusStyle) {
333 updateStyle();
334 }
335 return;
336 }
337 } else if (d->m_isActive == active) {
338 return;
339 }
340
341 d->m_isActive = active;
342 updateStyle();
343 update();
344 updateGeometry();
345 Q_EMIT activeTabChanged();
346}
347
349{
350 Q_D(DockTab);
351 d->m_panel = panel;
352}
353
355{
356 Q_D(const DockTab);
357 return d->m_panel;
358}
359
361{
362 Q_D(const DockTab);
363 return d->m_dockWidget;
364}
365
366const QIcon &DockTab::icon() const
367{
368 Q_D(const DockTab);
369 return d->m_icon;
370}
371
372void DockTab::setIcon(const QIcon &icon)
373{
374 Q_D(DockTab);
375 QBoxLayout *lay = qobject_cast<QBoxLayout *>(layout());
376 if (!d->m_iconLabel && icon.isNull()) {
377 return;
378 }
379
380 if (!d->m_iconLabel) {
381 d->m_iconLabel = new QLabel();
382 d->m_iconLabel->setAlignment(Qt::AlignVCenter);
383 d->m_iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
384 internal::setToolTip(d->m_iconLabel, d->m_label->toolTip());
385 lay->insertWidget(0, d->m_iconLabel, Qt::AlignVCenter);
386 lay->insertSpacing(1, qRound(1.5 * lay->contentsMargins().left() / 2.0));
387 } else if (icon.isNull()) {
388 // Remove icon label and spacer item
389 lay->removeWidget(d->m_iconLabel);
390 lay->removeItem(lay->itemAt(0));
391 delete d->m_iconLabel;
392 d->m_iconLabel = nullptr;
393 }
394
395 d->m_icon = icon;
396 d->updateIcon();
397}
398
399QSize DockTab::iconSize() const
400{
401 Q_D(const DockTab);
402 return d->m_iconSize;
403}
404
405void DockTab::setIconSize(const QSize &size)
406{
407 Q_D(DockTab);
408 d->m_iconSize = size;
409 d->updateIcon();
410}
411
412QString DockTab::text() const
413{
414 Q_D(const DockTab);
415 return d->m_label->text();
416}
417
418void DockTab::setText(const QString &title)
419{
420 Q_D(DockTab);
421 d->m_label->setText(title);
422}
423
425{
426 Q_D(const DockTab);
427 return d->m_label->isElided();
428}
429
431{
432 Q_D(const DockTab);
433 return d->m_dockWidget && d->m_dockWidget->features().testFlag(DockWidget::DockWidgetClosable);
434}
435
440
441void DockTab::setElideMode(Qt::TextElideMode mode)
442{
443 Q_D(DockTab);
444 d->m_label->setElideMode(mode);
445}
446
448{
449 Q_D(const DockTab);
450 return d->m_dragState;
451}
452
453void DockTab::setVisible(bool visible)
454{
455 Q_D(DockTab);
456 visible &= !d->m_dockWidget->features().testFlag(DockWidget::NoTab);
457 Super::setVisible(visible);
458}
459
461{
462 Q_D(DockTab);
463 if (!d->m_dockWidget->features().testFlag(DockWidget::DockWidgetFloatable)) {
464 return;
465 }
466
467 d->saveDragStartMousePosition(QCursor::pos());
468 d->startFloating(Qx::DockDraggingInactive);
469}
470
472{
473 Q_D(DockTab);
474 d->m_dockWidget->setAutoHide(true);
475}
476
478{
479 Q_D(DockTab);
480 int location = sender()->property(internal::LocationProperty).toInt();
481 d->m_dockWidget->toggleAutoHide((Qx::DockSideBarArea)location);
482}
483
485{
486 Q_D(DockTab);
487 d->updateCloseButtonSizePolicy();
488 d->updateCloseButtonVisibility(isActive());
489}
490
491bool DockTab::event(QEvent *e)
492{
493 Q_D(DockTab);
494#ifndef QT_NO_TOOLTIP
495 if (e->type() == QEvent::ToolTipChange) {
496 const auto text = toolTip();
497 d->m_label->setToolTip(text);
498 if (d->m_iconLabel) {
499 d->m_iconLabel->setToolTip(text);
500 }
501 }
502#endif
503 if (e->type() == QEvent::StyleChange) {
504 d->updateIcon();
505 }
506 return Super::event(e);
507}
508
509void DockTab::mousePressEvent(QMouseEvent *e)
510{
511 Q_D(DockTab);
512 if (e->button() == Qt::LeftButton) {
513 e->accept();
514 d->saveDragStartMousePosition(internal::globalPositionOf(e));
515 d->m_dragState = Qx::DockDraggingMousePressed;
517 d->focusController()->setDockWidgetTabPressed(true);
518 d->focusController()->setDockWidgetTabFocused(this);
519 }
520 Q_EMIT clicked();
521 return;
522 }
523 Super::mousePressEvent(e);
524}
525
526void DockTab::mouseReleaseEvent(QMouseEvent *e)
527{
528 Q_D(DockTab);
529 if (e->button() == Qt::LeftButton) {
530 auto currentDragState = d->m_dragState;
531 d->m_globalDragStartMousePosition = QPoint();
532 d->m_dragStartMousePosition = QPoint();
533 d->m_dragState = Qx::DockDraggingInactive;
534
535 switch (currentDragState) {
537 // End of tab moving, emit signal
538 if (d->m_panel) {
539 e->accept();
541 }
542 break;
543
545 e->accept();
546 d->m_floatingWidget->finishDragging();
547 break;
548
549 default:
550 break;
551 }
553 d->focusController()->setDockWidgetTabPressed(false);
554 }
555 } else if (e->button() == Qt::MiddleButton) {
557 d->m_dockWidget->features().testFlag(DockWidget::DockWidgetClosable)) {
558 // Only attempt to close if the mouse is still
559 // on top of the widget, to allow the user to cancel.
560 if (rect().contains(mapFromGlobal(QCursor::pos()))) {
561 e->accept();
562 Q_EMIT closeRequested();
563 }
564 }
565 }
566 Super::mouseReleaseEvent(e);
567}
568
569void DockTab::mouseMoveEvent(QMouseEvent *e)
570{
571 Q_D(DockTab);
572 if (!(e->buttons() & Qt::LeftButton) || d->isDraggingState(Qx::DockDraggingInactive)) {
573 d->m_dragState = Qx::DockDraggingInactive;
574 Super::mouseMoveEvent(e);
575 return;
576 }
577
578 // move floating window
579 if (d->isDraggingState(Qx::DockDraggingFloatingWidget)) {
580 d->m_floatingWidget->moveFloating();
581 Super::mouseMoveEvent(e);
582 return;
583 }
584
585 // move tab
586 if (d->isDraggingState(Qx::DockDraggingTab)) {
587 // Moving the tab is always allowed because it does not mean moving the
588 // dock widget around
589 d->moveTab(e);
590 }
591
592 auto mappedPos = mapToParent(e->pos());
593 bool mouseOutsideBar = (mappedPos.x() < 0) || (mappedPos.x() > parentWidget()->rect().right());
594 // Maybe a fixed drag distance is better here ?
595 int dragDistanceY = qAbs(d->m_globalDragStartMousePosition.y() - internal::globalPositionOf(e).y());
596 if (dragDistanceY >= DockManager::startDragDistance() || mouseOutsideBar) {
597 // If this is the last dock panel in a dock container with only
598 // one single dock widget it does not make sense to move it to a new
599 // floating widget and leave this one empty
600 if (d->m_panel->dockContainer()->isFloating() && d->m_panel->openDockWidgetsCount() == 1 &&
601 d->m_panel->dockContainer()->visibleDockPanelCount() == 1) {
602 return;
603 }
604
605 // Floating is only allowed for widgets that are floatable
606 // We can create the drag preview if the widget is movable.
607 auto features = d->m_dockWidget->features();
608 if (features.testFlag(DockWidget::DockWidgetFloatable) || (features.testFlag(DockWidget::DockWidgetMovable))) {
609 // If we undock, we need to restore the initial position of this
610 // tab because it looks strange if it remains on its dragged position
611 if (d->isDraggingState(Qx::DockDraggingTab)) {
612 parentWidget()->layout()->update();
613 }
614 d->startFloating(Qx::DockDraggingFloatingWidget);
615 }
616 return;
617 } else if (d->m_panel->openDockWidgetsCount() > 1 &&
618 (internal::globalPositionOf(e) - d->m_globalDragStartMousePosition).manhattanLength() >=
619 QApplication::startDragDistance()) // Wait a few pixels before start moving
620 {
621 // If we start dragging the tab, we save its initial position to
622 // restore it later
623 if (Qx::DockDraggingTab != d->m_dragState) {
624 d->m_tabDragStartPosition = this->pos();
625 }
626 d->m_dragState = Qx::DockDraggingTab;
627 return;
628 }
629
630 Super::mouseMoveEvent(e);
631}
632
637{
638 Q_D(DockTab);
639 if (e->button() == Qt::LeftButton) {
640 // If this is the last dock panel in a dock container it does not make
641 // sense to move it to a new floating widget and leave this one empty
642 if ((!d->m_panel->dockContainer()->isFloating() || d->m_panel->dockWidgetsCount() > 1) &&
643 d->m_dockWidget->features().testFlag(DockWidget::DockWidgetFloatable)) {
644 e->accept();
645 d->saveDragStartMousePosition(internal::globalPositionOf(e));
646 d->startFloating(Qx::DockDraggingInactive);
647 }
648 }
649
650 Super::mouseDoubleClickEvent(e);
651}
652
653void DockTab::contextMenuEvent(QContextMenuEvent *e)
654{
655 Q_D(DockTab);
656 e->accept();
657 if (d->isDraggingState(Qx::DockDraggingFloatingWidget)) {
658 return;
659 }
660
661 d->saveDragStartMousePosition(e->globalPos());
662
663 const bool isFloatable = d->m_dockWidget->features().testFlag(DockWidget::DockWidgetFloatable);
664 const bool isNotOnlyTabInContainer = !d->m_panel->dockContainer()->hasTopLevelDockWidget();
665 const bool isTopLevelArea = d->m_panel->isTopLevelArea(); // It is the only panel that opens in the container
666 const bool isDetachable = isFloatable && isNotOnlyTabInContainer;
667 QAction *action;
668 QMenu menu(this);
669
670 if (!isTopLevelArea) {
671 action = menu.addAction(tr("Detach"), this, SLOT(detachDockWidget()));
672 action->setEnabled(isDetachable);
674 action = menu.addAction(tr("Pin"), this, SLOT(autoHideDockWidget()));
675 auto isPinnable = d->m_dockWidget->features().testFlag(DockWidget::DockWidgetPinnable);
676 action->setEnabled(isPinnable);
677
678 auto pinMenu = menu.addMenu(tr("Pin To..."));
679 pinMenu->setEnabled(isPinnable);
680 d->createAutoHideToAction(tr("Top"), Qx::DockSideBarTop, pinMenu);
681 d->createAutoHideToAction(tr("Left"), Qx::DockSideBarLeft, pinMenu);
682 d->createAutoHideToAction(tr("Right"), Qx::DockSideBarRight, pinMenu);
683 d->createAutoHideToAction(tr("Bottom"), Qx::DockSideBarBottom, pinMenu);
684 }
685 }
686
687 menu.addSeparator();
688 action = menu.addAction(tr("Close"), this, SIGNAL(closeRequested()));
689 action->setEnabled(isClosable());
690 if (d->m_panel->openDockWidgetsCount() > 1) {
691 menu.addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested()));
692 }
693 menu.exec(e->globalPos());
694}
695
static bool testConfigFlag(ConfigFlag flag)
static bool testAutoHideConfigFlag(AutoHideFlag flag)
static int startDragDistance()
The distance the user needs to move the mouse with the left button hold down before a dock widget sta...
DockPanel manages multiple instances of DockWidgets.
Definition dockpanel.h:31
bool isActive() const
Definition docktab.cpp:304
void setIconSize(const QSize &size)
Definition docktab.cpp:405
virtual void contextMenuEvent(QContextMenuEvent *e) override
Definition docktab.cpp:653
DockWidget * dockWidget() const
Definition docktab.cpp:360
void detachDockWidget()
Definition docktab.cpp:460
void setActive(bool active)
Definition docktab.cpp:310
void setText(const QString &title)
Definition docktab.cpp:418
virtual ~DockTab()
Definition docktab.cpp:298
virtual void mousePressEvent(QMouseEvent *e) override
Definition docktab.cpp:509
virtual void setVisible(bool visible) override
Definition docktab.cpp:453
Qx::DockDragState dragState() const
Definition docktab.cpp:447
bool isTitleElided() const
Definition docktab.cpp:424
void activeTabChanged()
void onDockWidgetFeaturesChanged()
Definition docktab.cpp:484
bool isClosable() const
Definition docktab.cpp:430
void updateStyle()
Definition docktab.cpp:436
QFrame Super
Definition docktab.h:23
void setIcon(const QIcon &icon)
Definition docktab.cpp:372
void closeRequested()
void closeOtherTabsRequested()
virtual void mouseReleaseEvent(QMouseEvent *e) override
Definition docktab.cpp:526
void onAutoHideToActionClicked()
Definition docktab.cpp:477
void moved(const QPoint &globalPos)
QSize iconSize() const
Definition docktab.cpp:399
void autoHideDockWidget()
Definition docktab.cpp:471
const QIcon & icon() const
Definition docktab.cpp:366
virtual void mouseDoubleClickEvent(QMouseEvent *e) override
Double clicking the tab widget makes the assigned dock widget floating
Definition docktab.cpp:636
virtual void mouseMoveEvent(QMouseEvent *e) override
Definition docktab.cpp:569
void setDockPanel(DockPanel *panel)
Definition docktab.cpp:348
virtual bool event(QEvent *e) override
Definition docktab.cpp:491
void setElideMode(Qt::TextElideMode mode)
Definition docktab.cpp:441
QString text() const
Definition docktab.cpp:412
DockPanel * dockPanel() const
Definition docktab.cpp:354
The DockWidget class provides a widget that can be docked inside a DockWindow or floated as a top-lev...
Definition dockwidget.h:31
#define QX_DOCK_PRINT(s)
Copyleft (C) 2024 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
Definition dockutils.h:24
void repolishStyle(QWidget *w, RepolishChildOptions options)
Calls unpolish() / polish for the style of the given widget to update stylesheet if a property change...
QPoint globalPositionOf(QMouseEvent *e)
Definition dockutils.h:88
void setToolTip(QObjectPtr obj, const QString &tip)
Definition dockutils.h:56
DockSideBarArea
@ DockSideBarTop
@ DockSideBarBottom
@ DockSideBarLeft
@ DockSideBarRight
@ OuterDockAreas
DockDragState
@ DockDraggingTab
@ DockDraggingFloatingWidget
@ DockDraggingMousePressed
@ DockDraggingInactive
@ DockTabCloseIcon
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE
QColor window