目前使QT运行一个实例有三种方式:
1.QSharedMemory
使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动.
2. QtSingleApplication
使用QT扩展库QtSingleApplication,能很好的解决这个问题. 详见: http://qt.nokia.com/products/qt-addons/solutions-archive. 里面就是用的QLocalServer/QLocalSocket建立本地socket来判断实例是否存在
3. 利用QLocalServer实现
MyApplication.h
class MyApplication:public QApplication
{
Q_OBJECT
public:
MyApplication(int argc,char **argv);
bool isRunning();
private slots:
void newLocalConnection();
private:
QLocalServer *server;
bool _isRunning;
};
MyApplication.cpp
MyApplication::MyApplication(int argc, char **argv):QApplication(argc,argv)
{
_isRunning=false;
QCoreApplication::setApplicationName("localserver");
QString serverName=QCoreApplication::applicationName();
QLocalSocket socket;
socket.connectToServer(serverName);
if(socket.waitForConnected(500))
{
QTextStream stream(&socket);
QStringList args=QCoreApplication::arguments();
if(args.count()>1)
{
stream<<args.last();
}else
{
stream<<QString();
}
stream.flush();
qDebug()<<"Connected server,program will quit";
socket.waitForBytesWritten();
/**
*qApp->quit(); 此代码是用来退出事件循环的;在构造函数中,事件循环
*尚未启动,因此就无法退出. 最好就是设置标志判断在外部判断
*/
_isRunning=true;
return;
}
qDebug()<<"Can't connect to server,build a server";
server=new QLocalServer(this);
connect(server,SIGNAL(newConnection()),this,SLOT(newLocalConnection()));
if(server->listen(serverName))
{
//防止程序崩溃时,残留进程服务,移除之
if(server->serverError()==QAbstractSocket::AddressInUseError&&QFile::exists(server->serverName()))
{
QFile::remove(server->serverName());
server->listen(serverName);
}
}
}
void MyApplication::newLocalConnection()
{
QLocalSocket *socket=server->nextPendingConnection();
if(!socket)
return;
socket->waitForReadyRead(1000);
//显示传入参数值
QTextStream in(socket);
QString vl;
in>>vl;
qDebug()<<"The value is: "<<vl;
delete socket;
}
bool MyApplication::isRunning()
{
return _isRunning;
}
主程序:
main.cpp
int main(int argc,char **argv)
{
MyApplication app(argc,argv);
if(app.isRunning())
return 0;
QLabel label;
label.setText("Hello world");
label.show();
return app.exec();
}
第一个实例:
- 大小: 11 KB
- 大小: 12.4 KB
分享到:
相关推荐
在IT开发领域,尤其是使用Qt库进行C++应用程序设计时,有时我们需要确保程序只能有一个实例在运行,防止多个实例同时启动导致数据冲突或其他问题。本文将深入探讨如何使用Qt实现程序单实例运行的两种方案,并对提供...
1. 成熟稳定:Qt5是Qt框架的第五个主要版本,经过多年的发展和测试,已经非常成熟和稳定。 2. 社区支持:Qt5拥有庞大的开发者社区,你可以轻松找到大量的教程、解决方案和第三方库。 3. 平台支持:Qt5可以在各种操作...
使用共享内存和信号量实现QT应用程序单实例的方法,并且支持根据需要弹出已经运行的程序窗口,解决了同类软件存在的问题,而且程序非常简单。
QT开发及实例.zip这个压缩包文件是针对QT开发的一个详细教程,主要面向使用C++语言进行编程的开发者。QT是一个跨平台的开发框架,由Qt Company提供,被广泛应用于创建图形用户界面(GUI)应用程序,同时也支持命令行...
Qt是一个强大的跨平台应用程序开发框架,由The Qt Company开发并维护。它被广泛用于创建桌面、移动和嵌入式系统的用户界面和应用程序。Qt库提供了丰富的API,支持C++编程,同时也通过Qt Quick(QML)提供声明式编程...
在“Qt5开发及实例(完整版).pdf”中,你可能会学习到如何安装QT5开发环境,创建第一个QT项目,理解信号和槽机制,以及如何使用Q widgets和QML来构建UI。源代码部分会包含各种实例,例如简单的按钮点击事件处理,复杂...
QT5提供了丰富的库和工具,简化了UI设计、网络通信、数据库操作等多个领域的编程任务。本资料“QT5开发及实例 陆文周电子版”应包含关于QT5的基本概念、核心组件、设计模式以及实战应用等内容。 首先,QT5的基础...
它由The Qt Company提供,并且拥有一个强大的社区支持。QT5不仅限于GUI,还能处理网络、数据库、多媒体等多方面的应用开发。本资源包含QT5的开发教程以及源码实例,对于学习和提升QT5编程技能极具价值。 PDF教程...
接着,通过两个实际案例来加深理解,一个是小球碰撞游戏,另一个是简单绘图系统。这些案例都有配套的源代码供读者学习和实践。 首先,文档提到了C++程序设计课程设计实习指导书,由夏军宝编写,来自中国地质大学...
QT,全称Qt,是一个跨平台的C++图形用户界面应用程序开发框架,由挪威的Trolltech公司(现为The Qt Company)开发,被广泛应用于桌面应用、移动应用以及嵌入式系统中。QT的学习资源丰富多样,尤其适合初学者和有经验...
QT5是Qt库的第五个主要版本,是一个强大的跨平台应用程序开发框架,广泛用于创建桌面、移动和嵌入式系统的用户界面。它基于C++语言,但提供了丰富的API和类库,使得开发者能够轻松地构建功能丰富的图形用户界面。QT5...
在"Qt5开发及实例(第3版)源程序"中,每个子文件夹可能对应书中的一章或一个主题,每个文件通常是一个独立的示例,包含对应的C++和QML源代码。读者可以通过编译和运行这些代码,亲自动手实践,以加深对Qt5编程的理解...
信号与槽机制是Qt中的一个重要特性,它允许对象间进行通信,当某个事件发生时,发送信号的对象可以触发接收信号的对象执行相应的槽函数。 在源代码中,你可能会看到使用`QApplication`作为程序入口,它是整个应用的...
Qt5是Qt库的一个重要版本,由The Qt Company维护,它是一个广泛使用的开源C++图形用户界面应用程序开发框架。Qt5提供了丰富的API,支持多种操作系统,包括Windows、Linux、macOS、Android以及iOS等。本书第三版的...
QT摄像头界面编程实例是针对初学者的一个优秀项目,旨在帮助开发者了解如何在QT环境中集成摄像头功能并创建用户界面。QT框架是一种广泛使用的跨平台应用程序开发工具,尤其适用于GUI(图形用户界面)设计。通过QT,...
总的来说,这个QT应用程序实例集合是一个全面的学习资源,它涵盖了QT开发的各个层面,从基础的UI设计到复杂的网络通信,从源码组织到性能优化。无论你是初次接触QT,还是希望提升现有技能,这些实例都将提供宝贵的...
本资源为"QT5开发及实例(第三版)代码文件(全部可运行)",提供了书中18个章节的实践代码示例,旨在帮助开发者深入理解和应用QT5进行软件开发。 1. **QT5基础** - **安装与配置**:在不同操作系统(如Windows、...