例項QT程式 —— Qt單例不規則介面程式
目錄
1.簡介
本文主要介紹瞭如何實現Qt單例不規則介面程式,重點內容包含
- 如何實現單例程式;
- 如何實現不規則介面。
本文還有動態效果圖、重點講解和原始碼,讀者們可以方便檢視學習和交流。
回目錄
2.效果圖
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;
}
下面是重複啟動程式時的提示警告資訊:
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!
相關文章
- 例項QT程式 —— Qt自繪製小時鐘QT
- Qt 中Socket程式設計例項QT程式設計
- Qt中MainWindow類例項QTAI
- Qt繪圖淺析與例項QT繪圖
- vlc qt player 播放器開發例項QT播放器
- iptables 常用規則使用例項
- Qt5雙緩衝機制與例項QT
- Delphi趣味程式設計例項三則程式設計
- Nginx的Rewrite規則與例項Nginx
- html5 canvas 實現光線沿不規則路徑運動例項程式碼HTMLCanvas
- C# Winform程式介面優化例項C#ORM優化
- Qt自定義訊號槽的使用淺析+例項QT
- Qt5MV自定義模型與例項淺析QT模型
- 基於QT錄製PCM音訊例項詳細QT音訊
- 清空form表單例項程式碼ORM單例
- corba程式設計簡單例項ORB程式設計單例
- js選項卡簡單程式碼例項JS
- 簡單介紹正規表示式拆分url例項程式碼
- 多程式介面開發-Qt試玩兒QT
- 程式語言初學者“介面作用”例項解惑
- 匹配中文正規表示式程式碼例項
- JavaScript 表單驗證程式碼例項JavaScript
- js map集合簡單程式碼例項JS
- javascript閉包簡單程式碼例項JavaScript
- javascript作用域簡單例項程式碼JavaScript單例
- 表單提示美化效果程式碼例項
- JSON簡單格式程式碼例項JSON
- JavaScript 動畫效果簡單例項程式碼JavaScript動畫單例
- 以QT為例談環境搭建QT
- js獲取指定單元格的內容程式碼例項例項JS
- FreeSWITCH測試撥號規則例項
- 基於規則的應用例項——流
- jQuery表單驗證簡單程式碼例項jQuery
- QT OPENGL 與 shader 繪製展示視訊程式碼例項 OPenGL直接顯示YUV資料QT
- 單例模式入門講解C++和Qt5單例模式C++QT
- jQuery is() 程式碼例項jQuery
- java介面例項Java
- Qt:QT右鍵選單QT