有时候我们需要把很多控件放到qwidget控件里面,然后qwidget可以实现随意拖动,但是那些控件的功能不会改变,效果如下:
h:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_testqt02.h"
#include <QLabel>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qslider.h>
#include <qradiobutton.h>
#include <QMouseEvent>
#include <QVBoxLayout>
#include <qdebug.h>
class testqt02 : public QMainWindow
{
Q_OBJECT
public:
testqt02(QWidget *parent = nullptr);
~testqt02();
private:
QWidget* m_widget=nullptr;
QPushButton* m_btn = nullptr;
QSlider* m_slider = nullptr;
QVBoxLayout * m_layout = nullptr;
private:
void InitMenu();
void DealEvent();
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
QPoint mousePoint;
bool mouse_press;
private slots:
void m_btnevent();
};
cpp
#include "testqt02.h"
testqt02::testqt02(QWidget *parent)
: QMainWindow(parent){
resize(900,900);
InitMenu();
DealEvent();
}
testqt02::~testqt02()
{}
void testqt02::InitMenu()
{
m_widget = new QWidget(this);
m_widget->setGeometry(200, 300, 500, 400);
m_widget->setStyleSheet("background-color:white;");
m_btn = new QPushButton;
m_btn->setFixedSize(60, 60);
m_btn->setText("Start");
m_btn->setStyleSheet("background-color:yellow");
m_slider = new QSlider;
m_layout = new QVBoxLayout();
m_layout->addWidget(m_btn);
m_layout->addWidget(m_slider);
m_widget->setLayout(m_layout);
}
void testqt02::DealEvent()
{
connect(m_btn, SIGNAL(clicked(bool)), this, SLOT(m_btnevent()));
}
void testqt02::mousePressEvent(QMouseEvent *event)
{
if ((event->button() == Qt::LeftButton)) {
mouse_press = true;
//相对位置
mousePoint = m_widget->pos() - event->pos();
}
else if (event->button() == Qt::RightButton) {
this->close();
}
}
void testqt02::mouseMoveEvent(QMouseEvent *event)
{
if (mouse_press) {
QPoint newPos = mousePoint + event->pos();
QSize s1 = this->size();
QSize s2 = m_widget->size();
if (newPos.x() < 0) {
newPos.setX(0);
}
else if (newPos.x() > s1.width() - s2.width()) {
newPos.setX(s1.width() - s2.width());
}
if (newPos.y() < 0) {
newPos.setY(0);
}
else if (newPos.y() > s1.height() - s2.height()) {
newPos.setY(s1.height() - s2.height());
}
m_widget->move(newPos);
}
}
void testqt02::mouseReleaseEvent(QMouseEvent *event)
{
mouse_press = false;
}
void testqt02::m_btnevent() {
qDebug() << "ok";
}