目前使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
分享到:
相关推荐
1. 成熟稳定:Qt5是Qt框架的第五个主要版本,经过多年的发展和测试,已经非常成熟和稳定。 2. 社区支持:Qt5拥有庞大的开发者社区,你可以轻松找到大量的教程、解决方案和第三方库。 3. 平台支持:Qt5可以在各种操作...
Qt实现程序单实例运行的2中方案 方案1是文件锁 方案二是qtsingleapplication 但源码有所修改
使用共享内存和信号量实现QT应用程序单实例的方法,并且支持根据需要弹出已经运行的程序窗口,解决了同类软件存在的问题,而且程序非常简单。
资源包括用共享内存、自定义类SingleApplication、QT扩展类QtSingleApplication分别实现Qt应用的单实例运行功能,附有源代码及对应的word使用说明,如下载后有不明白的地方欢迎留言交流,如果有更简捷有效的方法,也...
qt5源码实例,能够编译运行,学习qt5的实战资源,非常适合学习qt5使用
使用QT5运行项目代码 # 这是一个关于QT C++开发的一款贪吃蛇小游戏项目工程源码文件,下载解压后,打开QT5可以直接运行,游戏屏蔽了所有窗口,只在空白的就可以桌面上运行,按ESC键可以退出屏幕
QT5开发及实例(第三版),书中18个章节各小结的全部代码,均可以直接运行。
本实例详细说明了怎么在Qt中使用QSqlDatabase类连接并操作数据Oracle数据库。Qt中使用Oracle数据库,必须得有数据库驱动。项目中已经包含了sqldrivers文件夹。也可将sqldrivers中的qsqloci4.dll文件复制到你的Qt安装...
QT实例100例全部代码,分为11章,每张的每个实例都有代码,自己运行时可以重新编译也可直接运行
基于QT的多线程下载实例,感觉还是蛮不错的,在自己很老的QT上运行都可以
qt实例源代码,经典的源代码,都可以运行。
本资源包含x86 linux下qt程序解决同时只允许运行一个程序实例的库,头文件和使用方法!
Qt5开发及实例,实例CH1905,自定义创建一个Button组件并在主窗口中使用它,运行效果如图19.11所示。 实现步骤如下。 (1)新建QML应用程序,项目名称为“Custom”。 (2)右击项目视图“资源”→“qml.qrc”下的“/”...
自已用Qt写的线程池实现程序,可以正常运行,用socket进行通讯,很适合初学者学习借鉴;
用qt写的实例,很不错。适合刚刚入门的 程序员学习参照。可在Linux下运行
实例QT程序: 在QTableWidget表格的单元格中添加和删除控件。 编译可以直接运行。 运行环境WIN10 Qt5.9.7 。 资源为源码压缩包:TableWidgetCellWidget.rar 相关文章链接如下: ...
实例QT程序 —— Qt自绘制小时钟 编译可以直接运行。 运行环境WIN10 Qt5.9.7 。 资源为源码压缩包: QT小时钟源码.rar 相关文章链接如下: https://blog.csdn.net/Redboy_Crazy/article/details/108891136