У меня есть родительский виджет, внутри которого я должен разместить собственный виджет (скажем 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
не видны, но они есть, поскольку курсор поворачивает указатель, когда я наводил курсор на то место, где они должны быть.
Что я делаю неправильно, и как мне заставить его работать?
'obj-> метаобъект() -> имя класса() == "ChildWidget"' может быть заменен 'qobject_cast (объект) = nullptr' –