【问题标题】:Qt: How to make translucent, windowless, chromeless window draggable?Qt:如何使半透明、无窗口、无铬的窗口可拖动?
【发布时间】:2012-04-19 13:13:43
【问题描述】:

我有一个基于半透明图像的窗口:

import QtQuick 1.1
import QtWebKit 1.1
  Image {
       source: "qrc:/assets/bg.png"
  }

在主窗口中是这样的

#include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
      setAttribute(Qt::WA_TranslucentBackground);
      setStyleSheet("background:transparent;");

      /* turn off window decorations */
      setWindowFlags(Qt::FramelessWindowHint);

      ui = new QDeclarativeView;
      ui->setSource(QUrl("qrc:/assets/ui.qml"));\

      setCentralWidget(ui);
    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtDeclarative/QDeclarativeView>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    QDeclarativeView *ui;
};
 #endif // MAINWINDOW_H

我想知道如何使我的窗口可以在屏幕上拖动(用户按下图像和药物窗口周围..)?

【问题讨论】:

  • 我认为您需要为鼠标单击和拖动事件创建一个事件处理程序,并从其中更改窗口位置。

标签: c++ qt window qml


【解决方案1】:

重新实现mousePressEvent()mouseReleaseEvent() 以了解用户何时按住鼠标,然后重新实现mouseMoveEvent(),如果用户按住鼠标,则移动小部件。

// **Untested code**
protected:
    virtual void mousePressEvent(QMouseEvent *event) { _mouseIsDown = true; }
    virtual void mouseReleaseEvent(QMouseEvent *event) { _mouseIsDown = false; }
    virtual void mouseMoveEvent(QMouseEvent *event) { if(_mouseIsDown) { move(event->pos() + globalPos()); } }

【讨论】:

  • @Wazery - 这就是我将其标记为“未经测试的代码”的原因。我只是想展示解决这个问题背后的想法。我自己也使用了非常相似的代码来做同样的事情。你遇到了什么问题?
【解决方案2】:
#include <QMouseEvent>
#include <Qpoint>

class MainWindow : public QMainWindow{
    ...

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    QPoint LastPoint;
    QPoint LastTopLeft;

    void mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton) {
             QPoint Point=event->globalPos();
             LastTopLeft=this->frameGeometry().topLeft();
             LastPoint=Point;
        }
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        if ((event->buttons() & Qt::LeftButton)) {
             const QPoint Point=event->globalPos();
             QPoint offset=Point-LastPoint;
             this->move(LastTopLeft+offset);
    }
    }
    ...
}

【讨论】:

    【解决方案3】:

    在我删除前两个声明后,它对我有用。

    【讨论】:

    • 您是否注意到这个问题在 2012 年 4 月被提出并接受了回答?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2011-04-26
    • 2016-10-09
    相关资源
    最近更新 更多