使用Qt創建懸浮窗口

在Qt中創建懸浮窗口(如無邊框、可拖動的浮動面板或提示框)可以通過以下方法實現。以下是幾種常見場景的解決方案:


方法1:使用無邊框窗口 + 鼠標事件拖動

適用于自定義浮動工具窗口(如Photoshop的工具欄)。

#include <QWidget>
#include <QMouseEvent>class FloatingWindow : public QWidget {
public:FloatingWindow(QWidget *parent = nullptr) : QWidget(parent) {// 設置窗口無邊框setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);// 設置半透明背景(可選)setAttribute(Qt::WA_TranslucentBackground);// 設置窗口尺寸resize(200, 150);// 添加內容(示例:添加一個標簽)QLabel *label = new QLabel("懸浮窗口內容", this);label->setAlignment(Qt::AlignCenter);}protected:// 實現鼠標拖動窗口void mousePressEvent(QMouseEvent *event) override {if (event->button() == Qt::LeftButton) {m_dragPosition = event->globalPos() - frameGeometry().topLeft();event->accept();}}void mouseMoveEvent(QMouseEvent *event) override {if (event->buttons() & Qt::LeftButton) {move(event->globalPos() - m_dragPosition);event->accept();}}private:QPoint m_dragPosition;
};// 使用示例
int main(int argc, char *argv[]) {QApplication a(argc, argv);FloatingWindow window;window.show();return a.exec();
}

方法2:自定義ToolTip樣式

當需要美化默認的懸浮提示時,可通過樣式表或自定義QToolTip

通過樣式表修改默認ToolTip
// 全局設置ToolTip樣式
qApp->setStyleSheet("QToolTip {""   background: #FFFFCC;""   color: #333333;""   border: 1px solid #FFAA00;""   border-radius: 3px;""   padding: 2px;""}"
);// 為某個控件設置ToolTip
QPushButton *button = new QPushButton("Hover Me");
button->setToolTip("這是自定義樣式的提示!");
創建自定義提示窗口

若需要更復雜的內容(如圖片、按鈕),可繼承QWidget實現:

class CustomToolTip : public QWidget {
public:CustomToolTip(QWidget *parent = nullptr) : QWidget(parent) {setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);QLabel *label = new QLabel("自定義提示內容", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(label);}
};// 在需要顯示的地方觸發
void showCustomToolTip(QWidget *target) {CustomToolTip *tip = new CustomToolTip(target);tip->move(target->mapToGlobal(QPoint(0, target->height())));tip->show();
}

方法3:結合事件過濾器實現懸停顯示

當鼠標懸停在某個控件上時顯示自定義懸浮窗口。

#include <QEvent>class HoverWidget : public QWidget {
public:HoverWidget(QWidget *parent = nullptr) : QWidget(parent) {setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);hide(); // 初始隱藏}
};// 在父控件中安裝事件過濾器
class MainWindow : public QWidget {
public:MainWindow() {QPushButton *button = new QPushButton("懸停顯示窗口", this);m_hoverWidget = new HoverWidget(this);m_hoverWidget->resize(100, 50);// 安裝事件過濾器到按鈕button->installEventFilter(this);}protected:bool eventFilter(QObject *obj, QEvent *event) override {if (obj == sender()) { // 假設sender是目標按鈕if (event->type() == QEvent::Enter) {// 顯示懸浮窗口QPoint pos = mapToGlobal(sender()->pos());m_hoverWidget->move(pos.x(), pos.y() + 30);m_hoverWidget->show();} else if (event->type() == QEvent::Leave) {m_hoverWidget->hide();}}return QWidget::eventFilter(obj, event);}private:HoverWidget *m_hoverWidget;
};

關鍵配置說明

  1. 窗口標志(Window Flags)

    • Qt::FramelessWindowHint:隱藏標題欄和邊框。
    • Qt::WindowStaysOnTopHint:窗口始終置頂。
    • Qt::ToolTip:短暫顯示的提示窗口(無任務欄圖標)。
  2. 透明背景

    setAttribute(Qt::WA_TranslucentBackground); // 允許透明
    
  3. 陰影效果

    // 通過樣式表添加陰影
    setStyleSheet("QWidget {""   background: white;""   border: 1px solid #CCCCCC;""   border-radius: 4px;""}""QWidget::shadow {""   qproperty-shadow: 5px 5px 5px rgba(0,0,0,30);""}"
    );
    

注意事項

  • 內存管理:若懸浮窗口是臨時創建的,需確保及時釋放(例如通過Qt::ToolTip標志或設置父對象)。
  • 性能優化:頻繁創建/銷毀窗口可能影響性能,建議復用窗口實例。
  • 平臺兼容性:某些標志(如透明背景)在某些平臺上可能不生效。

通過上述方法,可靈活實現不同風格的懸浮窗口,滿足工具提示、浮動面板等交互需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73557.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73557.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《P4387 【深基15.習9】驗證棧序列》

題目描述 給出兩個序列 pushed 和 poped 兩個序列&#xff0c;其取值從 1 到 n(n≤100000)。已知入棧序列是 pushed&#xff0c;如果出棧序列有可能是 poped&#xff0c;則輸出 Yes&#xff0c;否則輸出 No。為了防止騙分&#xff0c;每個測試點有多組數據&#xff0c;不超過 …

校園安全用電怎么保障?防觸電裝置來幫您

引言 隨著教育設施的不斷升級和校園用電需求的日益增長&#xff0c;校園電力系統的安全性和可靠性成為了學校管理的重要課題。三相智能安全配電裝置作為一種電力管理設備&#xff0c;其在校園中的應用不僅能夠提高電力系統的安全性&#xff0c;還能有效保障師生的用電安全&am…

【Git】--- 初識Git Git基本操作

Welcome to 9ilks Code World (??? ? ???) 個人主頁: 9ilk (??? ? ???) 文章專欄&#xff1a; Git 本篇我們來初步認識Git企業級應用是什么&#xff0c;有什么用以及Git基本操作。 &#x1f3e0; 初始Git 提出問題 在日常生活中&#xff0c;我們進行…

數據治理下半場:如何用文化變革撬動企業數字化轉型?

數據治理下半場:如何用文化變革撬動企業數字化轉型? 一、打破認知繭房:從"數據恐懼癥"到"數據生產力"二、重構協作生態:從"部門墻"到"數據共同體"三、建立責任體系:從"無人認領"到"終身責任制"?四、點燃創新…

Chat-Driven Business:靈活交互的新范式

1. 引言 一次偶然的機會&#xff0c;讀到了CSDN上的一篇文章&#xff0c;自定義markdown的展示(很遺憾&#xff0c;時間有點久&#xff0c;找不到具體的鏈接了&#xff09;&#xff0c;當時我覺得這很有啟發意義&#xff0c;因為我做的cli_assistant就是以markdown的形式返回的…

嵌入式裸機設計--MCU常用裸機架構有哪些?

為什么是裸機設計 792125321入群學習更高效&#xff01; 在MCU&#xff08;微控制器單元&#xff09;裸機開發中&#xff0c;我們常見的架構設計主要圍繞如何高效管理資源和任務調度。認識這些開發方式&#xff0c;對我們開發一個小型項目來說及有好處&#xff01; 下面介紹…

python內置函數sum的用法

知識點 - sum 函數 基本語法 sum(iterable[, start]) iterable 是一個可迭代對象&#xff0c;例如列表、元組、集合等&#xff0c;其中的元素通常是數字類型&#xff08;整數或浮點數&#xff09;。 start 是一個可選參數&#xff0c;表示累加的起始值&#xff0c;默認為 0。…

編程語言的幾種常見的分類方法

一、 按照編程范式分類 命令式編程語言 強調通過語句來改變程序狀態&#xff0c;如 C、Pascal、Fortran 等。 面向對象編程語言 基于對象和類的概念&#xff0c;支持封裝、繼承和多態&#xff0c;如 Java、C、Python、Ruby 等。 函數式編程語言 注重不可變性和純函數&#xf…

基于DeepSeek×MWORKS 2025a的ROM Builder自動化降階實戰

一、引言 當前&#xff0c;工業仿真領域正經歷著前所未有的「智能焦慮」——當自動駕駛算法已能理解城市路網&#xff0c;當大模型開始設計蛋白質結構&#xff0c;這個驅動大國重器研發的核心領域&#xff0c;卻仍在與千萬級方程組成的龐雜模型艱難博弈。傳統仿真降階如同在數…

配置單區域OSPF實驗和報文抓包和分析

一、配置單區域OSPF概念&#xff1a; &#xff08;1&#xff09;配置單區域OSPF&#xff08;Open Shortest Path First&#xff09;是一種常見的動態路由協議配置方式&#xff0c;主要用于在同一區域內實現路由信息的交換和路由表的更新。 &#xff08;2&#xff09;OSPF是一…

巴耶赫利專業俄語外貿網站建設

巴耶赫利是專業俄語外貿網站建設與俄語搜索引擎Yandex SEO優化服務商。巴耶赫利致力于幫助中國品牌出海俄羅斯&#xff0c;打開俄羅斯市場&#xff0c;提升品牌在俄羅斯的知名度和美譽度。 以下是對巴耶赫利相關服務的詳細介紹&#xff1a; 一、巴耶赫利專業俄語外貿網站建設…

Netty基礎—6.Netty實現RPC服務三

大綱 1.RPC的相關概念 2.RPC服務調用端動態代理實現 3.Netty客戶端之RPC遠程調用過程分析 4.RPC網絡通信中的編碼解碼器 5.Netty服務端之RPC服務提供端的處理 6.RPC服務調用端實現超時功能 5.Netty服務端之RPC服務提供端的處理 (1)RPC服務提供端NettyServer (2)基于反射…

路由器與防火墻配置命令

路由器與防火墻配置命令 小明啊&#xff0c;你不是學計算機的嘛&#xff0c;叔叔家的路由器壞了&#xff0c;可以過來幫叔叔看看嗎 命令可以用縮寫&#xff0c;造就一堆容易造成歧義的縮寫&#xff0c;比如add是address的縮寫&#xff0c;sh是shutdown的縮寫。 默認為Cisco路…

Go語言進化之旅:從1.18到1.24的語法變革

文章目錄 里程碑變革&#xff1a;泛型支持Go 1.18&#xff1a;泛型的引入Go 1.19-1.21&#xff1a;泛型的完善Go 1.24&#xff1a;泛型類型別名全面支持 循環與迭代的進化Go 1.22&#xff1a;循環變量作用域變化與整數遍歷Go 1.23&#xff1a;迭代器函數的支持Go 1.24&#xff…

發現一個GoVCL的問題

之前用govcl寫了一個服務端的界面程序&#xff0c;用來控制服務的開啟和關閉。 由于這個服務程序運行的時間比較長&#xff0c;經常是掛著在服務器上24小時不間斷運行。 后來經過調試發現&#xff0c;govcl的界面按鈕控件&#xff0c;在程序長時間運行后&#xff0c;會出現無法…

34個適合機械工程及自動化專業【論文選題】

論文選題具有極其重要的意義&#xff0c;它直接關系到論文的質量、價值以及研究的可行性和順利程度。選題明確了研究的具體領域和核心問題&#xff0c;就像給研究旅程設定了方向和目的地。例如&#xff0c;選擇 “人工智能在醫療影像診斷中的應用” 這一選題&#xff0c;就確定…

電腦實用小工具--VMware常用功能簡介

一、創建、編輯虛擬機 1.1 創建新的虛擬機 詳見文章新創建虛擬機流程 1.2 編輯虛擬機 創建完成后&#xff0c;點擊編輯虛擬機設置&#xff0c;可對虛擬機內存、處理器、硬盤等各再次進行編輯設置。 二、虛擬機開關機 2.1 打開虛擬機 虛擬機創建成功后&#xff0c;點擊…

雙指針算法專題之——有效三角形的個數

文章目錄 題目介紹思路分析AC代碼 題目介紹 鏈接: 611. 有效三角形的個數 思路分析 如果判斷三個數能否構成一個三角形&#xff0c;相信大家都知道&#xff1a; 只要任意兩邊之和大于第三邊即可。 比如三條邊長度為a&#xff0c;b&#xff0c;c 那只要滿足 ab>c ac>b b…

Linux內核實時機制27 - RT調度器10 - RT throttling 帶寬控制下

文章目錄 1、初始化帶寬 init_rt_bandwidth1.1、init_rt_bandwidth2、定時器處理2.1、sched_rt_period_timer2.2、do_sched_rt_period_timer3、總結1、初始化帶寬 init_rt_bandwidth rt_runtime : 一個時間周期內的運行時間,超過則限流,默認值為0.95ms 1、init_rt_bandwidth…

1.5[hardware][day5]

Link類跳轉指令可以拆分為兩個部分&#xff0c;一個是跳轉&#xff0c;即下一個PC的生成&#xff0c;如果將分支條件的比較放到譯碼級來進行&#xff0c;則這部分只涉及取值級和譯碼級流水&#xff1b;另一個是Link操作&#xff0c;簡單來說就是寫寄存器&#xff0c;這部則主要…