例項QT程式 —— Qt單例不規則介面程式

橙色陽光五月天發表於2020-10-20

目錄

1.簡介
2.效果圖
3.重點講解
4.原始碼



1.簡介

本文主要介紹瞭如何實現Qt單例不規則介面程式,重點內容包含

  • 如何實現單例程式;
  • 如何實現不規則介面。

本文還有動態效果圖、重點講解和原始碼,讀者們可以方便檢視學習和交流。


回目錄

2.效果圖

Qt單例不規則介面程式
Qt單例不規則介面程式


回目錄

3.重點講解

1)如何實現單例程式

通過共享記憶體QSharedMemory例項來限制同一個程式的重複啟動 。

    QSharedMemory *sharedMemory = new QSharedMemory("SingleApp");
    sharedMemory->attach();
    if(!sharedMemory->create(1))
    {
        QMessageBox::warning(0,QObject::tr("Warning"),
                             QObject::tr("The program is running!"));
        delete sharedMemory;
        a.exit(0);
        return 0;
    }

下面是重複啟動程式時的提示警告資訊:

Qt單例不規則介面程式重複啟動警告提示
Qt單例不規則介面程式重複啟動警告提示


2)如何實現不規則介面

  • 新建一個Pixmap物件載入圖片;
  • 固定視窗大小,將視窗大小設定為圖片大小;
  • 給視窗去掉邊框,設定視窗的flags;
  • 設定透明背景。
    //新建一個Pixmap物件
    QPixmap pixmap;

    //載入圖片
    pixmap.load(":/66.png");

    //固定視窗大小,將視窗大小設定為圖片大小
    setFixedSize( pixmap.width(), pixmap.height() );

    //給視窗去掉邊框,設定視窗的flags
    setWindowFlags(Qt::FramelessWindowHint | windowFlags() );

    //設定透明背景
    setAttribute(Qt::WA_TranslucentBackground);

不規則介面的移動操作需要重新實現滑鼠點選和移動事件。

protected:
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){  // 求出視窗移動之前的座標
        m_PointDrag = event->globalPos()-frameGeometry().topLeft();
    }
    if(event->button() == Qt::RightButton){ // 滑鼠右鍵關閉視窗
        close();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {   // 如果是滑鼠左鍵拖動, 移動視窗
        move(event->globalPos() - m_PointDrag);
    }
}

不規則介面還需要重新繪製背景圖片。

protected:
     void paintEvent(QPaintEvent *event);
void Widget::paintEvent(QPaintEvent */*event*/)
{
    QPainter painter(this);

    // 重新繪製圖片
    painter.drawPixmap(0, 0, QPixmap(":/66.png"));
}

回目錄

4.原始碼

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
     void paintEvent(QPaintEvent *event);
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::Widget *ui;
    QPoint m_PointDrag;      //儲存相對距離
};
#endif // WIDGET_H

widget.cpp
#include "widget.h"
#include "ui_widget.h"

#include <QMouseEvent>
#include <QPoint>
#include <QPixmap>
#include <QPainter>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //新建一個Pixmap物件
    QPixmap pixmap;

    //載入圖片
    pixmap.load(":/66.png");

    //固定視窗大小,將視窗大小設定為圖片大小
    setFixedSize( pixmap.width(), pixmap.height() );

    //給視窗去掉邊框,設定視窗的flags
    setWindowFlags(Qt::FramelessWindowHint | windowFlags() );

    //設定透明背景
    setAttribute(Qt::WA_TranslucentBackground);
}

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

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){  // 求出視窗移動之前的座標
        m_PointDrag = event->globalPos()-frameGeometry().topLeft();
    }
    if(event->button() == Qt::RightButton){ // 滑鼠右鍵關閉視窗
        close();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {   // 如果是滑鼠左鍵拖動, 移動視窗
        move(event->globalPos() - m_PointDrag);
    }
}

void Widget::paintEvent(QPaintEvent */*event*/)
{
    QPainter painter(this);

    // 重新繪製圖片
    painter.drawPixmap(0, 0, QPixmap(":/66.png"));
}

回目錄




加油,向未來!GO~
Come on!


相關文章