在 Qt 中可以通过组合 QLabel 和鼠标事件来实现这个需求。以下是一个简单的实现步骤:
- 使用
QLabel
显示文本。 - 为
QLabel
启用鼠标事件,通过重写其mousePressEvent
,mouseMoveEvent
和mouseReleaseEvent
实现拖动功能。 - 将
QLabel
设置为窗口的子控件,限制它的移动范围在窗口内。
cpp
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
class DraggableLabel : public QLabel {
Q_OBJECT
public:
explicit DraggableLabel(QWidget *parent = nullptr) : QLabel(parent), m_isDragging(false) {
setText("拖动我!");
setStyleSheet("background-color: lightblue; padding: 5px; border: 1px solid black;");
setAlignment(Qt::AlignCenter);
setFixedSize(100, 50);
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_isDragging = true;
m_dragStartPosition = event->pos();
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (m_isDragging) {
QPoint newPos = mapToParent(event->pos() - m_dragStartPosition);
QRect parentRect = parentWidget()->rect();
// 限制 QLabel 不超出父窗口范围
newPos.setX(qMax(parentRect.left(), qMin(newPos.x(), parentRect.right() - width())));
newPos.setY(qMax(parentRect.top(), qMin(newPos.y(), parentRect.bottom() - height())));
move(newPos);
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_isDragging = false;
}
}
private:
bool m_isDragging;
QPoint m_dragStartPosition;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle("可拖动文本");
window.resize(400, 300);
DraggableLabel *label = new DraggableLabel(&window);
label->move(150, 125); // 初始位置
window.show();
return app.exec();
}
#include "main.moc"