QT中文乱码

本文介绍了如何使用Qt的QLocalSocket和QLocalServer实现跨平台的应用程序单例模式,确保同一时刻只有一个应用程序实例运行。当有新的实例尝试启动时,会将启动参数发送给已存在的实例并退出。此外,还展示了如何将Qt应用最小化到系统托盘,以及如何将数据写入Excel文件。
摘要由CSDN通过智能技术生成

让Qt应用程序只运行一个实例
鉴客 发布于 2010年10月21日 17时 (2评) 3人收藏此代码, 我要收藏(?)
在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直接调用系统API,肯定可以做到,但是我们希望找到一个跨平台的通用的解决方案。

这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket实现,而在Windows上则采用有名管道(named pipe)来实现。

既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。

这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个 YourOwnApplication,然后在构造函数中进行,下面是一个示意。

首先是YourOwnApplication构造函数:



01    QString serverName = QCoreApplication::applicationName();
02     
03    QLocalSocket socket;
04    socket.connectToServer(serverName);
05     
06    if (socket.waitForConnected(500)) { //如果能够连接得上的话,将参数发送到服务器,然后退出
07     
08        QTextStream stream(&socket);
09        QStringList args = QCoreApplication::arguments();
10     
11        if (args.count() > 1)
12            stream << args.last();
13        else
14            stream << QString();
15        stream.flush();
16        socket.waitForBytesWritten();
17        qApp->quit();
18     
19        return;
20    }
21     
22    //运行到这里,说明没有实例在运行,那么创建服务器。
23     
24    m_localServer = new QLocalServer(this);
25     
26    connect(m_localServer, SIGNAL(newConnection()),
27                this, SLOT(newLocalSocketConnection())); //监听新到来的连接
28     
29    if (!m_localServer->listen(serverName)) {
30        if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
31                && QFile::exists(m_localServer->serverName())) { //确保能够监听成功
32            QFile::remove(m_localServer->serverName());
33            m_localServer->listen(serverName);
34        }
35    }
36    // 这样就保证了新启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值