2014-02-14 71 views
1

我的程序使用了一個名爲「grip」(它的對象名)的標籤旁邊的其他小部件組成的ui-form-file。 當我運行代碼時,我看到代碼行grip was not detected,我想知道爲什麼鼠標點擊標籤時無法識別。我還定義了一個mousePressEvent(QMouseEvent *event),如果我點擊該標籤,它就會按預期工作。Qt eventfilter沒有檢測到objectName

bool Note::eventFilter(QObject *target, QEvent *event) 
{ 
    if (event->type()==QEvent::MouseButtonPress){ 
     qDebug() << "in Note::eventFilter" << endl; 
     if (target->objectName()=="grip") 
     { 
      lastClicked="grip"; 
      qDebug() << "lastClicked == grip" << endl; 
     } 
     else 
      qDebug() << "grip was not detected" << endl; 
    } 
    return false; 
} 

什麼可能是一個target->objectName()=="grip"原因是假的,如果我點擊這個目標,它被稱爲「抓地」?

編輯:那是怎麼我的事件函數定義:

void Note::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton) 
    { 
     qDebug() << "Left mouse button click detected"; 
     ... 

主要事件過濾器被初始化的注意的構造函數:

Note::Note(std::vector<Note *> *nListIn){ 
    qDebug() << "in Note::Note()" << endl; 
    ui.setupUi(this); 
    installEventFilter(this); 
    setWindowFlags(Qt::FramelessWindowHint); 
    this->show(); //must be after the Qt::FramelessWindowHint 
    nList = nListIn; 
    nList->push_back(this); 
    qDebug() << "Size of nList (aka noteList)" << nList->size() << endl; 
} 

編輯2:發現了一些說明,也許這是原因?

如果您的小部件只包含子小部件,您可能不需要 來實現任何事件處理程序。如果您想檢測鼠標,請在子部件中單擊 ,調用 部件的mousePressEvent()中的子部件的underMouse()函數。

+2

更改日誌:'qDebug()<<「握未檢測到「<< target-> objectName();'查看調用事件過濾器的對象名稱。 ('endl'不需要,它總是附加在'qDebug'的情況下)。 –

+0

啊,聰明而且非常有用。它說「注意」,即標籤所包含的整個主要部件的名稱。你知道什麼,如果我可能不得不在QtDesigner中更改? – user2366975

+0

如果你使用'eventFilter',爲什麼你還要定義'mousePressEvent'呢?顯示你的'installEventFilter'調用。 –

回答

1

根據定義,如果你只安裝在本身(事件過濾器通過調用installEventFilter(this),以下成立:

bool Note::eventFilter(QObject *target, QEvent *) { 
    Q_ASSERT(target == this); 
    ... 
} 

顯然,目標永遠不會被稱爲grip,除非您已命名了Note類的實例的方式。

如果你要過濾的抓地力標籤上的事件,那麼你必須在標籤上安裝事件過濾器,而不是在Note部件。該Note部件將上就會得到孩子們忽視的事件,到那個時候,你「過濾」他們並不重要 - 這太遲了。

你的設置代碼可以包含,例如:

ui.grip->installEventFilter(this); 

或者,假設一無所知ui類的結構:

QWidget * grip = findChild<QWidget*>("grip"); 
if (grip) grip->installEventFilter(this);