恢复或将 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.
我已经使用在这个 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.