在 Qt 中可以通过组合 QLabel 和鼠标事件来实现这个需求。以下是一个简朴的实现步调:
- 使用 QLabel 显示文本。
- 为 QLabel 启用鼠标事件,通过重写其 mousePressEvent, mouseMoveEvent 和 mouseReleaseEvent 实现拖动功能。
- 将 QLabel 设置为窗口的子控件,限制它的移动范围在窗口内。
- #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"
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |