vs qt实现qwidget控件拖动

有时候我们需要把很多控件放到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";
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QT实现拖动控件,可以通过以下步骤: 1. 在需要拖动控件上设置属性 setDragEnabled(true),使其允许被拖动。 2. 重载控件的鼠标事件(mousePressEvent、mouseMoveEvent、mouseReleaseEvent),以实现控件拖动。 下面是一个简单的例子,演示如何拖动一个QPushButton控件: ```c++ // MyButton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> class MyButton : public QPushButton { public: MyButton(QWidget *parent = nullptr); protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; private: QPoint m_dragPosition; // 鼠标拖动时的位置 }; #endif // MYBUTTON_H ``` ```c++ // MyButton.cpp #include "MyButton.h" MyButton::MyButton(QWidget *parent) : QPushButton(parent) { setDragEnabled(true); // 允许拖动 } void MyButton::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_dragPosition = event->globalPos() - frameGeometry().topLeft(); event->accept(); } } void MyButton::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { move(event->globalPos() - m_dragPosition); event->accept(); } } void MyButton::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { event->accept(); } } ``` 在这个例子中,我们重载了 QPushButton 的三个鼠标事件,在 mousePressEvent 中记录了鼠标按下时的位置,以便在 mouseMoveEvent 中计算控件应该移动到的位置。在 mouseMoveEvent 中,如果鼠标左键被按下,则移动控件到新位置。在 mouseReleaseEvent 中,我们只是简单地接受了事件,没有做其他的事情。 最后,在主程序中创建一个 MyButton 实例,即可实现拖动功能: ```c++ #include "MyButton.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MyButton button("Drag me!", nullptr); button.setGeometry(100, 100, 100, 50); button.show(); return a.exec(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值