当前位置: 代码迷 >> QT开发 >> VS2012与QT5.2.1中,QDockWidget在float时有时候随鼠标移动
  详细解决方案

VS2012与QT5.2.1中,QDockWidget在float时有时候随鼠标移动

热度:46   发布时间:2016-04-25 03:15:42.0
VS2012与QT5.2.1中,QDockWidget在float时有时随鼠标移动
功能:悬浮时(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);
    }
  相关解决方案