我已经使用在此SO问题上找到的RunGuard代码将我的应用程序转换为单个实例应用程序:
Qt: Best practice for a single instance app protection
我想要做的是当用户尝试启动应用程序时,一个正在运行的应用程序是将现有正在运行的应用程序放在前面,如果最小化,则恢复它。
在我的Delphi Windows编程时代,我曾经在关闭它之前从新应用程序广播Windows消息。现有的应用程序将收到此并恢复自身并走到前面。
Windows和Linux平台上的Qt是否可以这样?
答案 0 :(得分:1)
QtSingleApplication有什么特别的问题吗?它应该足以满足您的需求,并使您能够向正在运行的应用程序发送消息。你只需要一个插槽来获取该消息,如果它符合你的期望,那么你就可以恢复它。
http://doc.qt.digia.com/solutions/4/qtsingleapplication/qtsingleapplication-example-trivial.html
logview对象也被设置为应用程序的激活窗口。每次收到消息时,窗口都会自动升起并激活。
答案 1 :(得分:0)
出于某种原因,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"
答案 2 :(得分:0)
通常,没有IPC就不可能。 QtSingleApplication
提供此类IPC,但您将从QtNetwork模块获得额外的依赖性。 (正如@svlasov回答的那样)
您将遇到的第一个问题:如果此应用程序不是前台,则无法引发任何应用程序窗口。对于Windows和OS X,有solutions,如何强制提升窗口。