4 个解决方案
#1
刚学QT,从网上拷了段代码给你,应该是可以的
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();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//运行到这里,说明没有实例在运行,那么创建服务器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //监听新到来的连接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //确保能够监听成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}
// 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出,
// 但是它发出的请求还没有被处理,
// 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。
////处理函数里面将窗口恢复至前端就行了
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();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//运行到这里,说明没有实例在运行,那么创建服务器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //监听新到来的连接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //确保能够监听成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}
// 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出,
// 但是它发出的请求还没有被处理,
// 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。
////处理函数里面将窗口恢复至前端就行了
#2
我这个就是一个本地小程序,没用到服务器。
#3
就是在本地创建一个QLocalSocket服务,对应于windows的实现就是管道
新的实例起来就先连这个LocalSocket服务,连上说明已经有程序在了,就给那个已存在的程序发个消息,通知它恢复到前面去
如果连不上,说明没有程序在,自己建个服务,说明自己是第一个实例
新的实例起来就先连这个LocalSocket服务,连上说明已经有程序在了,就给那个已存在的程序发个消息,通知它恢复到前面去
如果连不上,说明没有程序在,自己建个服务,说明自己是第一个实例
#4
很好!
#1
刚学QT,从网上拷了段代码给你,应该是可以的
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();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//运行到这里,说明没有实例在运行,那么创建服务器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //监听新到来的连接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //确保能够监听成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}
// 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出,
// 但是它发出的请求还没有被处理,
// 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。
////处理函数里面将窗口恢复至前端就行了
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();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//运行到这里,说明没有实例在运行,那么创建服务器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //监听新到来的连接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //确保能够监听成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}
// 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出,
// 但是它发出的请求还没有被处理,
// 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。
////处理函数里面将窗口恢复至前端就行了
#2
我这个就是一个本地小程序,没用到服务器。
#3
就是在本地创建一个QLocalSocket服务,对应于windows的实现就是管道
新的实例起来就先连这个LocalSocket服务,连上说明已经有程序在了,就给那个已存在的程序发个消息,通知它恢复到前面去
如果连不上,说明没有程序在,自己建个服务,说明自己是第一个实例
新的实例起来就先连这个LocalSocket服务,连上说明已经有程序在了,就给那个已存在的程序发个消息,通知它恢复到前面去
如果连不上,说明没有程序在,自己建个服务,说明自己是第一个实例
#4
很好!