如何让Qt应用程序只有一个实例

Qt实例1 - 查找框(1)组装零件

        在实质上选取中,大家日常需要让应用程序独有八个实例,再打开新的文书档案也许页面时,只是交替未来的窗口或然新开发三个标签,实际不是再一次开动二回应用程序。Qt中是还是不是可以实现那样呢,答案是早晚的,因为Qt本人可以平昔调用系统API,料定能够成功,不过大家愿意找到三个跨平台的通用的减轻方案。

Qt实例1 - 查找框(2)实现效果与利益

      那即将用到Qt的QLocalSocket,QLocalServer类了,这三个类从接口上看和网络通讯socket未有分别,但是它实际不是当真的互联网API,只是模仿了罢了。那八个类在Unix/Linux系统上运用Unix域socket完结,而在Windows上则动用盛名管道(named pipe)来落到实处。

Qt实例2 - 文本编辑器(1)参加查找框

      既然是互联网API,那么思路就相当粗略了,应用程序运营时首先会去连贰个服务器(这里经过应用程序的名字来标志,就如互连网端口同样),固然一连战败,那么则自身是率先个实例,就成立那样一个服务器,不然将开行参数发送到服务器,然后自行退出,而服务器会在接到通告之后举行拍卖。

 

      那些动作小编想最佳是放在成立Application实例后,因为Qt自身有众多操作未有Application实例是力所不及张开操作的(最少事件循环是在创建Application现在技巧运营吧),由此最棒的岗位便是经过持续QApplicaiton恐怕QCoreApplication自定义一个YourOwnApplication,然后在构造函数中开展,下边是二个表示。

 

首先是YourOwnApplication构造函数:

参考书籍

C++ GUI Qt4(第二版)

Qt Creator类别教程

 

 

联系情势

代码svn地址:

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()。

    QLocalSocket *socket = m_localServer->nextPendingConnection();

    if (!socket)

        return;

    socket->waitForReadyRead(1000);

    QTextStream stream(socket);

   … … //其余管理

    delete socket;

    mainWindow()->raise();

    mainWindow()->activateWindow(); //记得激活窗口哦

本文由明仕msyz手机版发布于旅游-环球旅讯,转载请注明出处:如何让Qt应用程序只有一个实例

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。