c ++ QT和OpenCV。 QLabel中的setMouseCallBack?

时间:2015-04-20 14:47:19

标签: c++ qt opencv

我正在使用函数setMouseCallback来提取有关每个鼠标事件的像素坐标的信息。如果我使用openCV窗口,我创建的程序将完美运行。确切地说:

图片是cv :: Mat;

cv::namedWindow("Original", WINDOW_NORMAL);
cv::imshow("Original", image);

cv::setMouseCallback("Original", mouseWrapper, NULL);

,其中

void esempio::onMouse(int event, int x, int y, int flags, void *param)
{
//---------------------------------------------------------
// Code to read the mouse event in the identification of a point
//---------------------------------------------------------
    if (event == CV_EVENT_LBUTTONDOWN)
        {
            std::cout << "1: " << x << "," << y << std::endl;
            pp_m.x=x;
            pp_m.y=y;
        }
}

void mouseWrapper( int event, int x, int y, int flags, void* param )
{
    esempio * mainWin = (esempio *)(param);
    mainWin->onMouse(event,x,y,flags,0);
}

现在,我想在我的界面中创建的QLabel中使用相同的代码。我尝试使用函数setWindowTitle以这种方式更改QLabel的名称:

ui->label_show->setWindowTitle("Test");
cv::setMouseCallback("Test", mouseWrapper, NULL); 

但这种做法似乎不够。

如何指示函数setMouseCallback处理所需的QLabel?

由于

1 个答案:

答案 0 :(得分:0)

这可能很难,因为:

  • 我不确定操作系统是否考虑了子窗口小部件的标题,我不确定OpenCV是否会识别非顶级窗口小部件的窗口标题;
  • Qt在内部处理子窗口小部件,除非被强制执行,否则不会将它们暴露给操作系统;
  • 最重要的是,OpenCV没有机会调用你的回调,因为Qt管理事件循环。

我不明白为什么不使用Qt自己的方法对鼠标事件作出反应。

在表单的构造函数中调用ui->label_show->installEventFilter(this)并实现虚拟eventFilter函数。在此函数中,您可以使用event参数来检索事件类型和鼠标坐标(在转换为QMouseEvent之后)。

请参阅event filters