2013-03-29 80 views
0

我正在寫一個應用程序,用於從圖像中手動選擇感興趣的區域。將出現兩個窗口:從OpenCV窗口寫入QListWidget

  1. 一個OpenCV窗口,其中用戶應該用鼠標選擇一個ROI。
  2. Qt的窗口,在這裏選擇的ROI的座標會出現(在QListWidget)

我的問題是如何寫到從OpenCV的鼠標偵聽器的QT窗口QListWidget。我想我必須在我的QT類中編寫一個函數,它返回一個指向QListWidget的指針,但我還沒有設法做到這一點。 有人可以請指出我在正確的方向嗎?

這裏是我的主:

#include "myclass.h" 
#include <QApplication> 
#include </PathToOPENCV/opencv/cv.h> 
#include </PathToOPENCV/opencv/highgui.h> 
#include <QtDebug> 
#include <QListWidget> 

using namespace cv; 

// Pointer to list widget? Should I use it as a global variable to recieve the pointer of the QListWidget? 

QListWidget * ptrToList; 

void mouseEvent(int evt, int x, int y, int flags, void* param){ 

    if(evt == CV_EVENT_LBUTTONUP){ 
     // WRITE HERE ONTO QListWidget! 
     // Something like: 
     ptrToList->addItem("blah"); 
    } 

} 

int main(int argc, char *argv[]) 
{ 

    /*----- OPENCV STUFF ----*/ 

    String windowName = "selectionWindow"; 
    namedWindow(windowName , CV_WINDOW_NORMAL); 
    Mat theImage = imread("/PATHTOIMAGE/1.jpg"); 
    imshow(windowName,theImage); 

    /* ---- Mouse Listener setup ----- */ 

    setMouseCallback(windowName, mouseEvent , 0); 

    /* ---- QT Stuff ---- */ 

    QApplication a(argc, argv); 
    myClass w; 
    w.show(); 

    // Should I do something like this? 
    ptrToList = w->getListPtr("listWidget"); 

    return a.exec(); 
} 

這裏是myclass.h

namespace Ui { 
class myClass; 
} 

class myClass : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit myClass(QWidget *parent = 0); 
    ~myClass(); 

private: 
    Ui::myClass *ui; 

    QListWidget * getListPtr(QString listName){ 
     QListWidget * theList; 
     // None of these work... 
     //theList = this->parent()->getChild(listName); 
     //theList = this->getChild(listName); 
     return(theList); 
    } 
}; 

編輯:

@Roku,

我想你的建議,但我認爲我做錯了。我在MyClass的附加功能用於設置鼠標回調,所以myclass.h是這樣的:

#include <functions.cpp> 
using namespace cv; 

namespace Ui { 
class myClass; /* error: forward declaration of 'struct Ui::myClass' */ 
} 

class myClass : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit myClass(QWidget *parent = 0); 
    ~myClass(); 

    void setInnerMouseCallback(String windowName){ 
     setMouseCallback(windowName, mouseEvent , ui->listWidget); /* error: invalid use of incomplete type 'struct Ui::myClass'*/ 
    } 

private: 
    Ui::myClass *ui; 
} 

然後,我添加了下面的代碼functions.cpp文件:

void mouseEvent(int evt, int x, int y, int flags, void* param){ 
    QListWidget * theList = (QListWidget*) param; 
    if(evt == CV_EVENT_LBUTTONUP){ 

     theList->addItem("blah"); 
    } 
} 

是這正確嗎?我指出了一些錯誤。感謝您的幫助。

+0

移動實際執行setInnerMouseCallback函數來myclass.cpp 。在myclass.h中,Ui :: myClass只是前向聲明的,編譯器不知道它包含像listWidget這樣的東西。 – 2013-03-30 06:26:44

回答

0

setMouseCallback()的第三個參數稱爲「用戶數據」,其類型爲void*。它旨在用於這種信息。您可以將setMouseCallback()函數調用移至主窗口。然後你可以使用這樣的功能:

setMouseCallback(windowName, mouseEvent, ui->listWidget); 

在鼠標事件的回調函數,你將有一個指針列表控件:

void mouseEvent(int evt, int x, int y, int flags, void* param) 
{ 
    if(evt == CV_EVENT_LBUTTONUP) 
    { 
     QListWidget* listWidget = (QListWidget*)param; 
     listWidget->addItem("blah"); 
    } 
} 
+0

非常感謝, – Sergio

+0

當我嘗試了你的建議時,我仍然遇到一些錯誤。我究竟做錯了什麼? – Sergio

+0

我怎麼知道?你得到什麼錯誤?如果可能的話,我會建議將main()中的OpenCV內容移到主窗口。 – 2013-03-29 23:12:58