Qt 特殊窗口处理

某需求涉及到一个这样的窗口:无边框、半透明、可以拖动(  但拖不出屏幕可视范围 )、永远置顶、任务栏不显示....


class MainWindow : public QWidget
{
    Q_OBJECT

private:
   QLabel *qrCode;

   bool    mMoveing;
   QPoint  mMovePosition;

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

    void CreateQRCode( QByteArray uploadText );

protected:
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
};


MainWindow::MainWindow(QWidget *parent) : QWidget(parent){

    mMoveing=false;
    setWindowFlags( Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint );

    QVBoxLayout *mainLayout = new QVBoxLayout;
    this->setLayout( mainLayout );

    qrCode =  new QLabel;
    //qrCode->setStyleSheet("background-color:#FFFFFF");

    mainLayout->addWidget( qrCode ,0,Qt::AlignCenter );

    QByteArray qrArray = "这是**在偷拍";
    CreateQRCode(  qrArray );

    setWindowOpacity(0.25);

    move((QApplication::desktop()->width()  - width() - 250 )/2,
         (QApplication::desktop()->height() - height() -250 )/2);

}

void MainWindow::mousePressEvent(QMouseEvent *event){

    mMoveing = true;
    mMovePosition = event->globalPos() - pos();
    return QWidget::mousePressEvent(event);
}


void MainWindow::mouseMoveEvent(QMouseEvent *event){

    if (mMoveing && (event->buttons() && Qt::LeftButton)
        && (event->globalPos()-mMovePosition).manhattanLength() > QApplication::startDragDistance()){
        move(event->globalPos()-mMovePosition);
        mMovePosition = event->globalPos() - pos();
    }
    return QWidget::mouseMoveEvent(event);
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event){

    mMoveing = false;

}



番外篇:得仙鹤指点,如此这般可以让窗口浮在任何工作窗口之上,但是不影响这个窗口的正常交互操作,如文字输入、鼠标选择、快捷键等;其他很多录屏、截图、取色器都是这个原理...

    setWindowFlags( Qt::FramelessWindowHint |
                    Qt::WindowTransparentForInput |
                    Qt::Dialog |
                    Qt::WindowStaysOnTopHint |
                    Qt::BypassWindowManagerHint);

    setAttribute(Qt::WA_TranslucentBackground, true);