[英]Qt-App on Windows Boot: Touchscreen generates mouse move to but no click
我們有一個Qt GUI應用程序正在通過注冊表Run / RunOnce-Key在啟動時啟動。
啟動時,Qt應用程序會從觸摸屏獲取位置,但本身不會獲得click事件(模擬鼠標單擊按鈕)。
手動運行時,Qt應用程序將定位並從觸摸屏單擊。
使用鼠標時,兩個版本都可以正常工作。 在啟動時啟動的其他應用程序也接受點擊觸摸。
我們沒有實現任何TouchEvent,觸摸屏僅被解釋為鼠標事件。 我猜想該應用程序將很快啟動並在完全加載觸摸屏驅動程序之前啟動,然后以某種方式使“ click”事件發生錯誤。 但是我根本不知道如何驗證這個問題或根本不查找問題。
我們運行的其他系統不會發生此問題,僅是一台我們現在遇到問題的Windows pc。 更換電腦是解決問題的一種選擇,但是我仍然想找到問題的根源,以確保不會再發生這種情況。 目前,它是每100個系統中就有一個出現此問題。
我編寫了一個小的應用程序,將一個eventFilter安裝到qApp,以查看實際到達的事件。 在啟動時運行時,我僅收到鼠標移動事件,而在稍后手動啟動時,我收到移動新聞發布事件。
我想知道其他人是否在Qt /“ clickapplications”和觸摸屏本身上遇到了類似的觸摸問題。
bool MouseFilter::eventFilter(QObject *o, QEvent *e)
{
if(e->type() == QEvent::MouseMove)
{
emit signalMouseMove();
return true;
}else if(e->type() == QEvent::MouseButtonRelease) {
emit signalMouseRelease();
return true;
}else if(e->type() == QEvent::MouseButtonPress) {
emit signalMousePress();
return true;
}else if(e->type() == QEvent::MouseButtonDblClick) {
emit signalMouseDoubleClick();
return true;
}
return QObject::eventFilter(o,e);
}
MouseFilter *mf = new MouseFilter();
qApp->installEventFilter(mf);
通過(替代方法)在QApplication調用之前添加睡眠計時器來“解決”問題。 該問題似乎與使用SSD的超快速啟動有關,並與注冊表運行鍵自動啟動有關,而觸摸屏驅動程序似乎仍在加載中。
重要提示:必須在創建QApplication之前進行sleep調用,否則您將繼續遇到問題。
int main(int argc, char *argv[])
{
QThread::sleep(15);
QApplication a(argc, argv);
if(!QDir::setCurrent(QApplication::applicationDirPath()))
QDir::setCurrent("C:\\ApplicationPath\\");
Translator *t = new Translator();
a.installEventFilter(t);
return a.exec();
}
Qt支持小組建議使用Windows本機函數檢查GetSystemMetrics(QT_SM_DIGITIZER)。 我對此進行了擴展,以使其具有一個漂亮的啟動畫面,以便用戶收到通知,正在發生某些事情:
static inline bool hasTouchSupport(QSysInfo::WinVersion wv)
{
enum { QT_SM_DIGITIZER = 94, QT_NID_INTEGRATED_TOUCH = 0x1,
QT_NID_EXTERNAL_TOUCH = 0x02, QT_NID_MULTI_INPUT = 0x40 };
return wv < QSysInfo::WV_WINDOWS7 ? false :
(GetSystemMetrics(QT_SM_DIGITIZER) & (QT_NID_INTEGRATED_TOUCH | QT_NID_EXTERNAL_TOUCH | QT_NID_MULTI_INPUT)) != 0;
}
int main(int argc, char *argv[])
{
if(!hasTouchSupport(QSysInfo::windowsVersion())) {
QApplication *ta = new QApplication(argc,argv);
QPixmap logo("C:\\PathToLogo\\LogoTransparent.png");
QSplashScreen splash(logo);
splash.show();
clock_t start = clock();
while(30*CLOCKS_PER_SEC > clock()-start)
{
if(hasTouchSupport(QSysInfo::windowsVersion()))
break;
ta->processEvents();
QThread::msleep(20);
}
splash.close();
ta->quit();
ta->processEvents();
delete ta;
}
QApplication *a = new QApplication(argc, argv);
//Custom Code goes here
return a->exec();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.