0

当我的应用程序处理这些 Windows 事件时,我的应用程序有 aQLineEdit和 aQPushButton不能正确响应键盘和鼠标的输入(QLineEdit不接收键盘输入,并且两者QLineEdit都没有接收鼠标输入):QPushButton

bool MainWindow::winEvent(MSG *msg, long *result)
{
    HWND hWnd = msg->hwnd;
    UINT message = msg->message;
    WPARAM wParam = msg->wParam;
    LPARAM lParam = msg->lParam;

    bool retval = true;
    LRESULT lRet = 0;

    switch(message)
    {
    case WM_PAINT:
    {
        HDC hDC = GetWindowDC(hWnd);
        PaintCustomCaption(hWnd, hDC); //Method responsible to draw the image at the non client area
        DeleteDC(hDC);
        break;
    }
    case WM_NCHITTEST:
    {
        lRet = HitTestNCA(hWnd, lParam); //Method responsible to deal with the window resizing and moving
        DwmDefWindowProc(hWnd, message, wParam, lParam, &lRet);
        break;
    }
    case WM_NCCALCSIZE:
    {
        break;
    }
    default:
    {
        retval = false;
        DwmDefWindowProc(hWnd, message, wParam, lParam, &lRet);
        break;
    }
    }

    *result = lRet;
    if(retval) return true;

    return QWidget::winEvent(msg, result);
}

如果我删除此类代码,我的 Qt 小部件可以正常工作,但我需要这些代码,因为我的应用程序正在窗口的非客户区绘制图像。

是否可以处理上面列出的 Windows 事件,让我的 Qt 小部件响应键盘和鼠标?

4

2 回答 2

2

QCoreApplication::processEvents()您可以在处理这些窗口事件时尝试定期调用。

于 2013-06-13T10:42:28.617 回答
1

您需要分析该代码并加快其速度,以免阻塞事件循环,或者您需要在单独的线程中运行该代码。

对于分析,我建议查看 valgrind、callgrind 和 kcachegrind。

至于线程,大多数 Qt 应用程序默认是单线程的,所以如果你不尽快将处理返回到事件循环,UI 事件将在事件循环中被阻塞,直到你将处理返回到事件才会得到处理环形。

在 Qt 中创建新线程非常容易。请参阅 QThread 上的 Qt 文档中的此示例:

void MyObject::putWorkerInAThread()
{
    Worker *worker = new Worker;
    QThread *workerThread = new QThread(this);

    connect(workerThread, &QThread::started, worker, &Worker::doWork);
    connect(workerThread, &QThread::finished, worker, &Worker::deleteLater);
    worker->moveToThread(workerThread);

    // Starts an event loop, and emits workerThread->started()
    workerThread->start();
}
于 2013-06-12T22:37:48.973 回答