功能:悬浮时(float)则显示窗口WindowTitlebar,停靠时(Dock)显示标题栏titleBarWidget
本意:移除至指定位置,鼠标松开即显示在当前位置;
现状:有一定几率会在鼠标松开后随鼠标移动;
源代码如下:
//> Dockwidget.h中 为QDockwidget的建立,包含一个由label组成的标题栏
/************************************Dockwidget.h中**************************************************************************/
#ifndef DOCKWIDGET_H
#define DOCKWIDGET_H
#include <QDockWidget>
#include <QLabel>
#include <QHBoxLayout>
#include <QDockWidget>
class DockwidgetMove : public QDockWidget
{
Q_OBJECT
public:
explicit Dockwidget(const QString &title,QWidget *parent);
~Dockwidget();
//> 初始化标题栏
void setTitleSize();
private:
QLabel *_title;
QHBoxLayout *_HLayout;
bool _Float;
QFont _font;
QWidget *_titleWidget;
private slots:
void SlotsetTitleBar(bool Changed);
};
#endif // DOCKWIDGET_H
/************************************Dockwidget.h中**************************************************************************/
//>Dockwidget.cpp中 为QDockwidget的建立,主要对label组成的标题栏进行布局和响应topLevelChanged事件
/************************************Dockwidget.cpp中**************************************************************************/
#include "Dockwidget.h"
Dockwidget::Dockwidget(const QString &title,QWidget *parent)
: QDockWidget(title,parent)
, _titleWidget(nullptr)
, _title(nullptr)
, _Float(false)
{
_HLayout = new QHBoxLayout(this);
_title = new QLabel(this);
_titleWidget = new QWidget(this);
_title->setText(title);
setTitleSize();
}
void Dockwidget::setTitleSize()
{
//标题栏文本
_font.setPointSize(9);
_title->setFont(_font);
_title->setFixedHeight(24);
//布局
_HLayout->addWidget(_title);
_HLayout->addStretch();
_titleWidget->setLayout(_HLayout);
setTitleBarWidget(_titleWidget);
connect(this,&Dockwidget::topLevelChanged,this,&Dockwidget::SlotsetTitleBar,Qt::QueuedConnection);
}
Dockwidget::~Dockwidget()
{
}
void Dockwidget::SlotsetTitleBar(bool Float)
{
if(Float)
setTitleBarWidget(NULL);
else
setTitleBarWidget(_titleWidget);
}
/************************************Dockwidget.cpp中**************************************************************************/
//>另外建立一个主窗口,并显示
/************************************MyWindow .h中**************************************************************************/
#pragma once
#include <QtWidgets/QMainWindow>
#include "Dockwidget.h"
class MyWindow : public QMainWindow
{
public:
MyWindow(QWidget *parent = 0):QMainWindow(parent){DW = new Dockwidget("Dock",this);}
~MyWindow(void){}
private:
Dockwidget *DW;
};
/************************************MyWindow .h中**************************************************************************/
/************************************main.cpp中**************************************************************************/
#include "dockwidget.h"
#include "MyWindow.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWindow w;
w.show();
return a.exec();
}
/************************************main.cpp中**************************************************************************/
------解决方案--------------------
MyWindow(QWidget *parent = 0):QMainWindow(parent)
{
DW = new Dockwidget("Dock",this);
addDockWidget(Qt::LeftDockWidgetArea, DW);
}