QML QQuickView实现窗口拖动,无边框和透明的效果。

QQuickView 方式的拖动窗口参考网上的怎么样都实现不了,特别上有几个例子带有mainWindow的,所以我用信号槽交给了C++处理。这里通过信号和槽来控制。

无边框部分 只要在C++部分使用

 
  
QQuickView *m_pView = new QQuickView;
m_pView ->setFlags(Qt::FramelessWindowHint|Qt::Window| Qt:: WindowStaysOnTopHint );
   //这里如果没有Qt::window 在WIndows下面的开始栏里就不会显示哦 
   //Qt::WindowStaysOnTopHint 可以开关 窗口是否浮现在 windows下面的开始栏的上方或者下方

透明部分  在C++使用

m_pView->setColor(QColor(Qt::transparent));
//或者 
m_pView->setColor(QColor(255,0,0,100));
 //这个是粉红透明的

最后是拖动部分啦,我把整个代码都拿出来:

main.cpp

#include "mainwindow.h"
#include 
#include 
 
  
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
 
  

mainwidow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
class QQuickView;
namespace Ui {
class MainWindow;
}
 
  
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void slot_drag(int x,int y);
private:
    Ui::MainWindow *ui;
 
  
    QQuickView *m_pView;
};
 
  
#endif // MAINWINDOW_H
mainwidow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
 
  
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
  
    m_pView = new QQuickView;
    m_pView->setFlags(Qt::FramelessWindowHint|Qt::Window|Qt::WindowStaysOnTopHint);
    m_pView->setColor(QColor(255,0,0,100));
    m_pView->setSource(QUrl(QStringLiteral("qrc:/login.qml")));
    m_pView->show();
 
  
    QQuickItem *rootObject = m_pView->rootObject();
    QObject::connect(rootObject,SIGNAL(send_drag(int,int)),this,SLOT(slot_drag(int,int)));
 
  
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::slot_drag(int x, int y)
{
    m_pView->setX(m_pView->x() + x);
    m_pView->setY(m_pView->y() + y);
}

最后是qml文件啦。  login.cpp

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
 
  
Item {
    id:loginDialog
    width:522
    height: 373
 
  
    signal send_drag(int x,int y)
 
  
    MouseArea{
        width:  loginDialog.width
        height: 100;
        property point clickPos: "0,0"
        onPressed: {
            clickPos = Qt.point(mouse.x,mouse.y)
            console.log("clicked")
        }
        onPositionChanged: {
            var delat =  Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
            send_drag(delat.x , delat.y)
            console.log("x:" + delat.x + "  y:" + delat.y )
        }
    }
}

这样就大功告成了。我再把 链接发出来。文件里面有些没用的我注释掉了,不要介意,因为是我写的DEMO而已。

https://download.csdn.net/download/always_kay/10289828

你可能感兴趣的:(QML QQuickView实现窗口拖动,无边框和透明的效果。)