查看完整版本: [-- QVtkWidget镶嵌到QWidget中,原本的QWidget::nativeEvent中的部分事件就无法响应 --]

QTCN开发网 -> 其它技术开发讨论区 -> QVtkWidget镶嵌到QWidget中,原本的QWidget::nativeEvent中的部分事件就无法响应 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

keep_a_cat 2020-01-09 11:09

QVtkWidget镶嵌到QWidget中,原本的QWidget::nativeEvent中的部分事件就无法响应

我做个QVTKWidget窗口类,想镶嵌到QMainWidget主界面中。

但是一旦把QVtkWiget父窗口设置为主窗口界面时,
原本QMainWIdget主界面中nativeEvent事件部分消息(WM_NCHITTEST)就无法响应,
而且所有控件的hover、pressed样式也失效。

如果把QVtkWidget窗口父窗口设置为空,主界面就会恢复正常。

是不是QVTKWidget将一些消息给拦截了?求各个大佬帮忙


void VTK3DModelEditor::initWindowVtk()
{
//     QVTKWidget vtkWidget = new QVTKWidget ();
//     vtkWidget ->setWindowFlags(Qt::Widget | Qt::WindowStaysOnTopHint);

    QVTKWidget vtkWidget = new QVTKWidget (this);
    auto hlayout = new QHBoxLayout(ui.widget_vtk);
    hlayout->addWidget(m_vtkWidget);
}


bool VTK3DModelEditor::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG* msg = (MSG*)message;
    switch (msg->message) {

    case WM_NCHITTEST://此消息就无法响应
    {
        initMousePos();
        switch (m_mousePos)
        {
        case MousePos_Cap:
            *result = HTCAPTION;
            return true;
        case MousePos_Top:
            *result = HTTOP;
            return true;
        case MousePos_Bom:
            *result = HTBOTTOM;
            return true;
        case MousePos_Left:
            *result = HTLEFT;
            return true;
        case MousePos_Right:
            *result = HTRIGHT;
            return true;
        case MousePos_TopLeft:
            *result = HTTOPLEFT;
            return true;
        case MousePos_TopRight:
            *result = HTTOPRIGHT;
            return true;
        case MousePos_BomLeft:
            *result = HTBOTTOMLEFT;
            return true;
        case MousePos_BomRight:
            *result = HTBOTTOMRIGHT;
            return true;
        case MousePos_None:
        default:
            break;
        }
    }
    break;
    case WM_NCCALCSIZE:
        return true;

    case WM_GETMINMAXINFO:
    {
        static int flag = 3;
        if (::IsZoomed(msg->hwnd)) {
            if (flag == 1)
            {
                *result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
                return true;
            }
            flag = 1;
            RECT frame = { 0, 0, 0, 0 };
            AdjustWindowRectEx(&frame, WS_OVERLAPPEDWINDOW, FALSE, 0);
            frame.left = abs(frame.left);
            frame.top = abs(frame.bottom);
            this->setContentsMargins(frame.left, frame.top, frame.right, frame.bottom);
        }
        else {
            if (flag == 0)
            {
                *result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
                return true;
            }
            flag = 0;
            this->setContentsMargins(0, 0, 0, 0);
        }

        *result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
        return true;
    }
    break;
    }

    return QWidget::nativeEvent(eventType, message, result);
}


查看完整版本: [-- QVtkWidget镶嵌到QWidget中,原本的QWidget::nativeEvent中的部分事件就无法响应 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled