销户c语言,c – 如何在注销时优雅地退出QApplication?

我有一个带有通知区域图标的应用程序,因此主窗口可能会忽略关闭事件.我正在尝试保存应用程序退出的首选项和历史记录.我还想在应用程序运行时处理注销.虽然应用程序是跨平台的,但它在GNU /

Linux中最方便/最有用,因此Windows注销行为的关注度要低得多.

这是一个用于测试不同桌面环境/窗口管理器行为的最小可编译示例:

// main.cpp

# include

# include

# include

# include

# include

class M : public QMainWindow

{

Q_OBJECT

public:

~M();

public slots:

void onAboutToQuit();

private:

void closeEvent(QCloseEvent *);

};

M::~M()

{

std::cout << "M::~M()" << std::endl;

}

void M::onAboutToQuit()

{

std::cout << "onAboutToQuit()" << std::endl;

}

void M::closeEvent(QCloseEvent * e)

{

std::cout << "closeEvent()" << std::endl;

hide();

QTimer::singleShot(5000, this, SLOT(show()));

e->ignore();

}

int main(int argc, char * argv[])

{

QApplication app(argc, argv);

M m;

m.setWindowModality(Qt::NonModal);

m.connect(& app, SIGNAL(aboutToQuit()),

SLOT(onAboutToQuit()));

m.show();

return app.exec();

}

# include "main.moc"

// CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

project(closeeventbug)

option(QT5 "Use Qt5" OFF)

if(QT5)

find_package(Qt5Core REQUIRED)

find_package(Qt5Widgets REQUIRED)

else()

find_package(Qt4 REQUIRED)

include_directories(${QT_INCLUDES})

endif()

include_directories(${CMAKE_CURRENT_BINARY_DIR})

set(CMAKE_AUTOMOC ON)

add_executable(closeeventbug main.cpp)

if(QT5)

qt5_use_modules(closeeventbug Core Widgets)

else()

target_link_libraries(closeeventbug ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})

endif()

注销时大多数完整的桌面环境都会尝试关闭可见窗口.但由于测试应用程序在关闭时不会退出,因此注销将被中断/取消.如果在窗口不可见时执行注销,它会正常退出(就像我想要的那样).功能较少的桌面环境/窗口管理器会忽略仍在运行的应用程序并退出.他们中的大多数甚至没有警告应用程序有关注销,因此文件中既没有“closeEvent()”,也没有“onAboutToQuit()”,也没有“M :: ~M()”,程序输出被重定向.

详细结果(所有非Windows结果来自Manjaro GNU / Linux):

>完整的桌面环境,如果可见窗口拒绝退出,则取消注销,优雅地完成隐形应用程序:

closeEvent()

onAboutToQuit()

M::~M()

{ KDE, XFCE, Mate, GNOME, Cinnamon }

所有其他人都不取消退出,但其中一些人试图警告应用程序.

>我不知道为什么onAboutToQuit()出现在日志中,但M :: ~M()不是这种情况……

closeEvent()

onAboutToQuit()

{ Windows7 }

3.

closeEvent()

{ icewm, E17 }

4.

{ RazorQt, LxDE, LxQt, i3, budgie, fluxbox, awesome, openbox,

wmii, E16, pekWM, uwm, fvwm, xmonad, spectrwm, windowmaker,

herbstluftwm, WindowsXP }

对于(GCC 4.9.1或Clang 3.4.2)AND(Qt 4.8.6 OR Qt 5.3.1)的任何组合,行为完全相同.然而,当我在Xubuntu上尝试Qt 4.8和Qt 5.2时,结果有些不同:XFCE中的Qt 5.2没有阻塞 – 无论主窗口可见性如何,应用程序都能正常完成.但Qt 4.8存在阻塞(与Manjaro相同).

我知道可以正确处理注销(没有阻塞),因为有几个应用程序可以做到这一点.所有这些都有通知区域图标,关闭通知区域,但不阻止注销.

>基于Qt:GoldenDict,Transmission-Qt,Kopete;

>以GTK为基础:Audacious,Pidgin.

我检查了基于Qt的源代码,发现处理closeEvent没什么特别之处:

https://github.com/goldendict/goldendict/blob/master/mainwindow.cc

void MainWindow::closeEvent( QCloseEvent * ev )

{

if ( cfg.preferences.enableTrayIcon && cfg.preferences.closeToTray )

{

ev->ignore();

hide();

}

else

{

ev->accept();

qApp->quit();

}

}

https://github.com/bfleischer/transmission/blob/master/qt/mainwin.cc

void

TrMainWindow :: closeEvent( QCloseEvent * event )

{

// if they're using a tray icon, close to the tray

// instead of exiting

if( !myPrefs.getBool( Prefs :: SHOW_TRAY_ICON ) )

event->accept( );

else {

toggleWindows( false );

event->ignore( );

}

}

void

TrMainWindow :: toggleWindows( bool doShow )

{

if( !doShow )

{

hide( );

}

else

{

if ( !isVisible( ) ) show( );

if ( isMinimized( ) ) showNormal( );

//activateWindow( );

raise( );

QApplication::setActiveWindow( this );

}

}

git clone git://anongit.kde.org/kopete

void KopeteWindow::closeEvent ( QCloseEvent *e )

{

// if we are not ok to exit on close and we are not shutting down then just do what needs to be done if a

// window is closed.

KopeteApplication *app = static_cast ( kapp );

if ( !shouldExitOnClose() && !app->isShuttingDown() && !app->sessionSaving() ) {

// BEGIN of code borrowed from KMainWindow::closeEvent

// Save settings if auto-save is enabled, and settings have changed

if ( settingsDirty() && autoSaveSettings() )

saveAutoSaveSettings();

if ( queryClose() ) {

e->accept();

}

// END of code borrowed from KMainWindow::closeEvent

kDebug ( 14000 ) << "just closing because we have a system tray icon";

}

else

{

kDebug ( 14000 ) << "delegating to KXmlGuiWindow::closeEvent()";

KXmlGuiWindow::closeEvent ( e );

}

}

所以问题:

>即使主窗口可见,如何确保我的应用程序不会阻止注销?

>如何确保在尽可能多的桌面环境/窗口管理器中注销时调用onAboutToQuit()和~M()?

我怀疑应该收听一些系统信号,但我不知道究竟是哪一个……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

randomized algorithms 有哪些_毛毯分类有哪些 毛毯的种类

毛毯分类有哪些 毛毯的种类毛毯分类有哪些 毛毯的种类 a)毛毯分为双人毛毯、单人毛毯、童毯等多种规格。 b)按用途还可以床毯、膝毯、沙滩毯等。 c)毛毯还可以进行特殊整理:阻燃毛毯、防菌整理、负离子整理等等。 d)下面我按织造方式进行介绍: 一.机织毛毯 1.按原料分 羊毛毛毯…

c语言验证24点,C语言解24点游戏程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼前几天在微博上看到24点的游戏&#xff0c;6 6 610。算了很久是在算不出来&#xff0c;最后我想我何不写一个小程序解决它&#xff1f;说做就做&#xff0c;我刚开始的想法很简单&#xff0c;就是列举4个数的所有可能的表达式组合&…

floodlight ovs 更改拓扑_淘宝更改类目降权多久?被降权了怎么办?_推广运营(淘宝天猫)...

现在淘宝 (淘宝论坛)店主在经营店铺的过程中&#xff0c;会考虑将自己特别店铺进行类目的更改&#xff0c;那么也有一点店主会担心到如果淘宝更改类目会被降权吗?如果被降权了怎么办呢?那就一起了解具体的内容吧!跟大家分享一些淘宝宝贝被降权的处理方式&#xff1a;1、虚假销…

android 事务管理软件,安卓 Android基于安卓移动终端的个人事务管理系统

摘 要随着移动平台的崛起&#xff0c;越来越多的传统PC软件被移植到移动平台&#xff0c;比如ipad&#xff0c;iphone&#xff0c;Android等智能终端设备&#xff0c;在这些平台中&#xff0c;Android占领着最大的市场份额&#xff0c;所以为Android用户开发满足日常使用的软件…

word无法打开请去应用商店_word软件是什么?word文档是什么?可以用来干什么?...

1、为什么需要Microsoft Word&#xff1f;仅在计算机上安装操作系统不足以提高生产力。无论是创建电子表格&#xff0c;演示文稿&#xff0c;电子邮件还是文档&#xff0c;您都需要软件来执行所需的任何活动。Microsoft Word用于创建文档或您需要存储文本的任何内容。如果您购买…

android四个按钮平分,android 水平平分两个按钮

项目中需要显示水平两个按钮&#xff0c;且都要有间距&#xff0c;如下图所示&#xff1a;首先我想到的是使用权重&#xff0c;然后利用水平布局&#xff0c;这样应该可以实现&#xff0c;但真实的情况是这样的&#xff0c;代码如下&#xff1a;android:layout_width"fill…

iPhone清理喇叭灰尘_iphone正确清理扬声器灰尘的方法

夏天来临各种各样的手机问题就都出现了&#xff0c;手机发热已经成为了热议话题&#xff0c;网上的妙招也是层出不穷甚至有销售水冷装置风扇手柄的&#xff0c;或者diy给手机加铜钹&#xff0c;又或者使用石墨烯等等的方法&#xff0c;但还是避免不了发热&#xff0c;除手机发热…

Android搭建web,Android手机搭建WEB环境

原文&#xff1a;http://yangshare.com/Y-BLOG/?p246#more-246准备1、下载Android处理器对应的jdk包&#xff0c;类似树莓派archandroidlocalhost:~$ archarmv7l下载地址&#xff1a;jdk-8u152-linux-arm32-vfp-hflt.tar.gz2、安装一个xftp或者宝塔面板这样的文件操作工具xftp…

qq浏览器网页版_QQ邮箱回应部分用户登录异常:系后台服务波动,问题已解决...

5月6日消息&#xff0c;针对用户反映QQ邮箱登录异常情况&#xff0c;腾讯QQ邮箱官方回应称&#xff0c;因后台服务波动&#xff0c;部分用户出现登录异常情况&#xff0c;目前问题已解决。5月6日上午&#xff0c;有网友反映QQ邮箱崩溃&#xff0c;换浏览器依然无法登录&#xf…

android nfc ndef mifareclassic,Android NFC开发-实践篇

Android NFC开发-实践篇https://blog..net/_GYG/article/details/72899417在Android NFC开发-理论篇中&#xff0c;我们了解了在Android中开发NFC的一些理论知识&#xff0c;这篇我们继续应用我们上一篇学到的知识&#xff0c;实现对NDEF格式标签和MifareClassic格式标签的读写…

苹果6换屏多钱_苹果手机屏幕碎了怎么办?维修更换要多少钱

手机在使用过程中最容易发生的意外就是手滑摔碎屏幕了&#xff0c;那么苹果手机屏幕碎了碎了&#xff0c;维修更换要多少钱&#xff1f;大家都知道&#xff0c;苹果手机摔坏&#xff0c;进水均属于人为损坏&#xff0c;人为损坏不属保修范围&#xff0c;接下来针对苹果手机屏幕…

harmonyos sdk,HarmonyOS SDK对应的API版本跃迁引发的历史工程适配问题解决方案

历史工程自动适配由于最新版本的HarmonyOS SDK对应的API Version发生了跃迁&#xff0c;原有的API Version 3变成了当前的API Version 4&#xff0c;原有的API Version 4变成了当前的API Version 5。因此&#xff0c;使用最新版本的DevEco Studio打开历史工程&#xff0c;需要对…

dataframe 拼接_拼接关系图在石材生产过程中的重要性

石材生产加工中应用许多图&#xff0c;石材纹理图、平面面置图、平面图、立面图、剖面图&#xff0c;这些图对石材生产加工都有很大的帮助&#xff0c;发挥着各自的作用&#xff0c;担负着各自的角色。除了这些图外&#xff0c;石材生产加工中还有一种图—拼接关系图&#xff0…

android外置sd大小,android 读取外置和内置存储卡路径和大小

【实例简介】android 读取外置和内置存储卡路径和大小,亲测好使&#xff0c;项目中以运用【实例截图】【核心代码】a81fbea6-cb7a-4c96-be21-d52578f6de0a└── SDCardInfo├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ …

app名字变为android+api,一起来做个app吧 wanandroid开放API

由于早期开放的一些API页码为0开始&#xff0c;后期接口修改为从1开始&#xff0c;为了兼顾之前的开放API&#xff0c;故无法统一。对于POST接口建议使用postman模拟在编写过程中如果遇到一些问题&#xff0c;也有一些参考项目&#xff0c;这里针对Java和Kotlin各自选择了一款&…

php 武汉海关对接_“双11”临近 海口海关全力备战跨境电商监管高峰

中新网海南新闻11月6日电(李佳臣)海口海关6日发布消息称&#xff0c;面对“双11”这一中国电商行业的年度盛事&#xff0c;海口马村港海关已做好准备&#xff0c;确保“双11”期间跨境电商业务24小时即时通关&#xff0c;包裹通关、出区“零等待”。为迎接即将到来的“双11”网…

更改android模拟器dns,Android模拟器无法联网 模拟器DNS设置

Android模拟器默认的地址是10.0.2.3&#xff0c;默认的DNS也是10.0.2.3&#xff0c;对于在家里上网学习Android的人(像我)来讲&#xff0c;一般电脑的IP都是192.168.1.100之类的&#xff0c;不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很…

嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...

不好意思久等了这篇文章让小伙伴们久等了。一年多以来&#xff0c;关于嵌入式开发学习路线、规划、看什么书等问题&#xff0c;被问得没有一百&#xff0c;也有大几十次了。但是无奈自己对这方面了解有限&#xff0c;所以每次都没法交代&#xff0c;搞得实在不好意思。但是办法…

html怎样纵向分栏,css页面中常见左中右分栏布局的两种实现方式

以下代码复制粘贴即可使用&#xff1a;示例一&#xff1a;复制代码代码如下:.page_center {width:100%;}#nav {background-color:red;height:20px;}#left {width:120px;background-color:green;position:absolute;}#middle {background-color:yellow;}#right {width:120px;back…

java面试题_1000道Java工程师面试题+答案PDF485页

说实话&#xff0c;作为一名 Java 程序员&#xff0c;不论你需不需要面试都应该好好看下这份资料。我大概撸了一遍&#xff0c;真的是堪称典范。就目前国内的面试模式来讲&#xff0c;在面试前积极的准备面试&#xff0c;复习整个 Java 知识体系将变得非常重要&#xff0c;可以…