原理:
因为在视图中,所以和传统的widget中界面拖动不一样!
要把坐标转化为视图的坐标才行!
运行截图如下:
里面的界面是这样的:
程序结构如下:
源码如下:
form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = 0);
~Form();
private:
Ui::Form *ui;
};
#endif // FORM_H
mycustomproxy.h
#ifndef MYCUSTOMPROXY_H
#define MYCUSTOMPROXY_H
#include <QGraphicsProxyWidget>
#include <QPointF>
class MyCustomProxy : public QGraphicsProxyWidget
{
Q_OBJECT
public:
MyCustomProxy(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
void initWindowsFrame();
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
void mousePressEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
private:
QPointF m_z;
};
#endif // MYCUSTOMPROXY_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QGraphicsScene;
class MyCustomProxy;
QT_END_NAMESPACE
class Form;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QGraphicsScene *m_scene;
MyCustomProxy *m_myCustomProxy;
Form *m_form;
};
#endif // WIDGET_H
form.cpp'
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
mycustomproxy.cpp
#include "mycustomproxy.h"
#include <QGraphicsSceneMouseEvent>
#include <QWidget>
MyCustomProxy::MyCustomProxy(QGraphicsItem *parent, Qt::WindowFlags wFlags)
: QGraphicsProxyWidget(parent, wFlags)
{
}
void MyCustomProxy::initWindowsFrame()
{
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
}
void MyCustomProxy::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsProxyWidget::mouseMoveEvent(event);
QPointF y = mapToScene(event->pos());
QPointF x = y - m_z;
if(widget() != NULL)
setGeometry(QRectF(x.rx(), x.ry(), widget()->width(), widget()->height()));
}
void MyCustomProxy::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsProxyWidget::mousePressEvent(event);
QPointF y = mapToScene(event->pos());
QPointF x = scenePos();
m_z = y - x;
}
void MyCustomProxy::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsProxyWidget::mouseReleaseEvent(event);
m_z = QPointF();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mycustomproxy.h"
#include "form.h"
#include <QGraphicsScene>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("CSDN IT1995");
ui->graphicsView->setRenderHints(ui->graphicsView->renderHints()
| QPainter::Antialiasing
| QPainter::SmoothPixmapTransform);
m_scene = new QGraphicsScene;
m_scene->setSceneRect(-500, -500, 500, 500);
ui->graphicsView->setScene(m_scene);
m_myCustomProxy = new MyCustomProxy;
m_myCustomProxy->setWindowFlags(Qt::Window);
m_myCustomProxy->initWindowsFrame();
m_form = new Form;
m_myCustomProxy->setWidget(m_form);
m_myCustomProxy->setPos(-m_form->width(), -m_form->height());
m_scene->addItem(m_myCustomProxy);
}
Widget::~Widget()
{
delete ui;
}
但是,这样做只能靠点击控件,才能拖动,点界面其他地方就不能脱了。
只要这么做,就可以实现界面其他地方也可以拖动!
重写Form中的mousePressEvent函数
如下:
form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = 0);
~Form();
protected:
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
private:
Ui::Form *ui;
};
#endif // FORM_H
form.cpp
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
void Form::mousePressEvent(QMouseEvent *event)
{
}
千万不要再调用他父类的mousePressEvent!!!!