恢复或将 Qt 桌面应用程序置于最前面

Restoring or bringing to front Qt desktop application

我已经使用在这个 SO 问题上找到的 RunGuard 代码将我的应用程序变成了单实例应用程序:

Qt: Best practice for a single instance app protection

我想做的是,当用户尝试启动一个应用程序时 运行 是将现有的 运行 应用程序置于最前面,如果最小化,则恢复它。

在我的 Delphi Windows 编程日里,我曾经在关闭新应用程序之前广播一条 Windows 消息。现有的应用程序将收到此信息并自行恢复并出现在前面。

Qt 在 Windows 和 Linux 平台上可以实现类似的功能吗?

您在使用 QtSingleApplication 时遇到过任何具体问题吗?它应该足以满足您的需求,并且可以让您向 运行 应用程序发送消息。您只需要一个插槽来获取该消息,如果它符合您的预期,那么您就可以恢复它。

http://doc.qt.digia.com/solutions/4/qtsingleapplication/qtsingleapplication-example-trivial.html

The logview object is also set as the application's activation window. Every time a message is received, the window will be raised and activated automatically.

出于某种原因,setActivationWindow()activateWindow() 对我不起作用。这是我的解决方法:

#include <QWidget>
#include <qtsingleapplication.h>

class Window : public QWidget
{
    Q_OBJECT
public:
    Window(QWidget *parent = 0) : QWidget(parent) {}

public slots:
    void readMessage(const QString &str) { showNormal(); }
};

int main(int argc, char *argv[])
{
    QtSingleApplication instance(argc, argv);
    Window *window = new Window;
    window->show();

    QObject::connect(&instance, SIGNAL(messageReceived(const QString &)), window, SLOT(readMessage(const QString &)));

    if (instance.sendMessage(""))
        return 0;

    return instance.exec();
}

#include "main.moc"

一般来说,没有IPC是不行的。 QtSingleApplication 提供此类 IPC,但您将从 QtNetwork 模块获得额外的依赖性。 (正如@svlasov 回答的那样)

您将遇到的第一个问题:如果此应用程序不是前台应用程序,则您无法提出任何 window 应用程序。有solutions for Windows and OS X,如何强制提升windows.