2015-04-06 3 views
0

У меня есть родительский виджет, внутри которого я должен разместить собственный виджет (скажем QFrame). Внутри этого пользовательского виджета я должен разместить несколько дочерних виджетов (полученных от QPushButton). Я хочу, чтобы дочерние виджеты имели определенный фон при нормальных обстоятельствах, а другой - при зависании. Это мой код:Фильтр событий Qt скрывает виджет

//parent widget code, where the QFrame derived widget is initialized 
QFrameDerivedWidget *qFrameWidget = new QFrameDerivedWidget(this, someString); 

Это файл QFrameDerivedWidget заголовка:

//QFrameDerivedWidget header file 
class QFrameDerivedWidget: public QFrame 
{ 
    Q_OBJECT 

public: 
    QFrameDerivedWidget(QWidget *aParent, 
         std::string someValue); 
    bool eventFilter(QObject *obj, QEvent *event); 
} 

Это файл QFrameDerivedWidget реализации, то ChildWidget класса определен и объявлен рядный:

class ChildWidget: public QPushButton 
{ 
Q_Object 
public: 
    ChildWidget(std::string aText, QWidget *aParent); 

}; 

ChildWidget::ChildWidget(std::string aText, QWidget *aParent): 
           QPushButton(QString::fromStdString(aText),aParent) 
{ 
    this->setFixedHeight(30); 
    this->setMouseTracking(true); 
    this->setCursor(Qt::PointingHandCursor); 
    /* ---other custom styling--- */ 
} 

bool QFrameDerivedWidget::eventFilter(QObject *obj, QEvent *event) 
{ 
    // this never prints out anything, even though it should for any mouseenter, mouseleave, click, etc event on it 
    qDebug() << obj->metaObject()->className() << endl; 

    if (obj->metaObject()->className() == "ChildWidget") 
    { 
     //including this line throws a 'missing QObject missing macro error' as well 
     ChildWidget *option = qobject_cast<ChildWidget* >(obj); 
     if (event->type() == QEvent::Enter) 
     { 
      option->setStyleSheet("---"); 

     } 
     if (event->type() == QEvent::Leave) 
     { 
      option->setStyleSheet("---"); 
     } 
     return QWidget::eventFilter(obj, event); 
    } 
    else 
    { 
     // pass the event on to the parent class 
     return QWidget::eventFilter(obj, event); 
    } 
} 

QFrameDerivedWidget::QFrameDerivedWidget(QWidget *aParent, 
        std::string someVal): fParent(aParent) 
{ 
    initUI(); 
} 

QFrameDerivedWidget::initUI() 
{ 
    this->setParent(fParent); 
    this->setAttribute(Qt::WA_Hover); 
    this->setMouseTracking(true); 
    QWidget *dd = new QWidget(this); 
    QVBoxLayout *layout = new QVBoxLayout(); 
    dd->setLayout(layout); 
    for (int i = 0; i < fValues.size(); i++) 
    { 
     ChildWidget *button = new ChildWidget(fValues[i],dd); 
     button->addEventFilter(this); 
     layout->addWidget(button); 
    } 
} 

Идея заключается в том, что всякий раз, когда я наматываюсь на QFrameDerivedWidget и вводим любые ChildWidget, его цвет фона должен измениться. Кроме того, я установил оператор qDebug() внутри eventFilter. В настоящее время он не работает, кнопки ChildWidget не видны, но они есть, поскольку курсор поворачивает указатель, когда я наводил курсор на то место, где они должны быть.

Что я делаю неправильно, и как мне заставить его работать?

+0

'obj-> метаобъект() -> имя класса() == "ChildWidget"' может быть заменен 'qobject_cast (объект) = nullptr' –

ответ

2
  1. Вы забыли добавить Q_OBJECT макрос в ChildWidget декларации
  2. Вы должны отслеживать мышь (setMouseTracking(true))
  3. Вы должны установить setAttribute(Qt::WA_Hover) в виджете
  4. Будьте уверены, что вам действительно нужно return true; в вашем фильтр событий вместо того, чтобы возвращать QWidget::eventFilter(obj, event);. Вам не нужно отфильтровывать события наведения.
+0

' ChildWidget' уже получен из 'QPushButton! ', который содержит встроенный макрос. Зачем мне это нужно снова? И я попытался это сделать, я все равно получаю ошибку. – SexyBeast

+0

@ Купидогель вы можете прочитать Qt-документацию о макросе Q_OBJECT. И я думаю, что у вас нет ошибок, но предупреждение. Я не мог помочь вам без SSCCE. –

+0

Подождите, я попробую все это снова. Gimme некоторое время .. – SexyBeast

Смежные вопросы