【发布时间】:2011-08-23 06:38:42
【问题描述】:
我的 Linux 程序有一个类似 MyProgram_0001 的名称,并且新版本的编号更高。启动时,应用程序会在同一目录中查找更新的版本,如果找到,则通过 execl() 调用它。这很好用,但是当鼠标继续工作时,即使我事先在其窗口中单击,新版本也不会获得任何键盘输入。调用应用程序消失了,其他正在运行的程序继续获得键盘输入......有什么想法吗?实际上该程序是编写一个 C++ Qt Designer 4.7 应用程序,但这不应该是重要的,或者它可能是:-)?
好的,更多信息...这是捕获键并调用我的 SLOT 的代码...
// define my own event handler
// capture all key presses ...
bool Layout10::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
// directly exit on Alt-keys
if (keyEvent->modifiers()&Qt::AltModifier) return true;
// normal keyboard
if ((!(keyEvent->modifiers()&Qt::KeypadModifier))&&(Keyboard_On)) switch (keyEvent->key())
{
case Qt::Key_0: C->Num0ButtonClicked_KP(); return true;
case Qt::Key_1: C->Num1ButtonClicked_KP(); return true;
case Qt::Key_2: C->Num2ButtonClicked_KP(); return true;
case Qt::Key_3: C->Num3ButtonClicked_KP(); return true;
case Qt::Key_4: C->Num4ButtonClicked_KP(); return true;
case Qt::Key_5: C->Num5ButtonClicked_KP(); return true;
case Qt::Key_6: C->Num6ButtonClicked_KP(); return true;
case Qt::Key_7: C->Num7ButtonClicked_KP(); return true;
case Qt::Key_8: C->Num8ButtonClicked_KP(); return true;
case Qt::Key_9: C->Num9ButtonClicked_KP(); return true;
case Qt::Key_X: C->XButtonClicked_KP(); return true;
case Qt::Key_Backspace: C->EButtonClicked_KP(); return true;
case Qt::Key_F1: C->F1ButtonClicked_KP(); return true;
case Qt::Key_F2: C->F2ButtonClicked_KP(); return true;
case Qt::Key_F3: C->F3ButtonClicked_KP(); return true;
}
// keypad
if ((keyEvent->modifiers()&Qt::KeypadModifier)&&(Keypad_On)) switch (keyEvent->key())
{
case Qt::Key_0: C->Num0ButtonClicked_KP(); return true;
case Qt::Key_Insert: C->Num0ButtonClicked_KP(); return true;
case Qt::Key_1: C->Num1ButtonClicked_KP(); return true;
case Qt::Key_End: C->Num1ButtonClicked_KP(); return true;
case Qt::Key_2: C->Num2ButtonClicked_KP(); return true;
case Qt::Key_Down: C->Num2ButtonClicked_KP(); return true;
case Qt::Key_3: C->Num3ButtonClicked_KP(); return true;
case Qt::Key_PageDown: C->Num3ButtonClicked_KP(); return true;
case Qt::Key_4: C->Num4ButtonClicked_KP(); return true;
case Qt::Key_Left: C->Num4ButtonClicked_KP(); return true;
case Qt::Key_5: C->Num5ButtonClicked_KP(); return true;
case Qt::Key_Clear: C->Num5ButtonClicked_KP(); return true;
case Qt::Key_6: C->Num6ButtonClicked_KP(); return true;
case Qt::Key_Right: C->Num6ButtonClicked_KP(); return true;
case Qt::Key_7: C->Num7ButtonClicked_KP(); return true;
case Qt::Key_Home: C->Num7ButtonClicked_KP(); return true;
case Qt::Key_8: C->Num8ButtonClicked_KP(); return true;
case Qt::Key_Up: C->Num8ButtonClicked_KP(); return true;
case Qt::Key_9: C->Num9ButtonClicked_KP(); return true;
case Qt::Key_PageUp: C->Num9ButtonClicked_KP(); return true;
case Qt::Key_Back: C->XButtonClicked_KP(); return true; // maybe it should have been backslash ?
case Qt::Key_Delete: C->EButtonClicked_KP(); return true;
case Qt::Key_division: C->F1ButtonClicked_KP(); return true;
case Qt::Key_multiply: C->F2ButtonClicked_KP(); return true;
case Qt::Key_Minus: C->F3ButtonClicked_KP(); return true;
}
return true; // event is NOT given over for further processing
}
else
{
return false; // other events may be processed further
}
}
Keyboard_On 只是该类的公共布尔成员,如果向用户呈现触摸屏,我使用它来禁用键盘。上面的消息处理程序是这样安装的...
this->installEventFilter(this);
...在小部件类的构造函数中...我有一个这样的处理程序,用于构成我的对话框的所有小部件类...嗯,除非我通过 execl 或@987654324 从自身启动应用程序,否则它可以工作@...
在startDetached() 的描述中有一件事引起了我的注意......他们写道,新进程在自己的环境中运行,并且在 Linux 下表现得像一个守护进程。我想知道这是否就是我松开钥匙的原因......
这真的让我很困惑。是否有一些按键必须通过的层链以及我可以调试它并查看我在什么级别松开它们的方法?谢谢!
更多信息...我发现如果我通过 execl 调用完全相同的二进制文件,我不会松开键盘。如果我将该二进制文件复制到另一个名称并调用它......键盘就消失了。它归结为 execl 调用中的单个字母更改,仅在第二个参数中,所有其他都相同,错误仍然发生......如果路径+二进制文件相同,似乎有一些上下文保持不变,但是否则,密钥将被发送到旧上下文,并且通过 execl 调用的文件在不同的上下文中启动...
【问题讨论】: