Всплывающий виджет календаря QDateEdit при щелчке мышью в любом месте текстовой области, а не только стрелкой вниз, - PullRequest
1 голос
/ 19 марта 2019

Я использовал фильтр событий для моего QDateEdit 'sdateEdit' следующим образом:

bool Class::eventFilter ( QObject *obj, QEvent *event )
{
    if(event->type() == QEvent::MouseButtonPress)
    {      
        sdateEdit->calendarWidget()->show();

    }
    else
        return QObject::eventFilter ( obj, event );
}

Но это не работает. Я пытался .. sdateEdit-> setCalendarPopup (true). Это не сработало.

1 Ответ

1 голос
/ 19 марта 2019

В этом случае я реализовал пользовательский QDateEdit, стратегия состоит в том, чтобы использовать eventFilter, когда вы щелкаете по QLineEdit и отправляете событие щелчка стрелке:

#include <QtWidgets>

class DateEdit: public QDateEdit
{
public:
    DateEdit(QWidget *parent=nullptr):
        QDateEdit(parent)
    {
       lineEdit()->installEventFilter(this);
    }
    bool eventFilter(QObject *watched, QEvent *event) override
    {
        if(watched == lineEdit() && event->type() == QEvent::MouseButtonPress){
            QStyleOptionComboBox opt;
            opt.init(this);
            QRect r = style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, this);
            QPoint p = r.center();
            QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, p, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
            QCoreApplication::sendEvent(this, event);
        }
        return QDateEdit::eventFilter(watched, event);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    DateEdit w;
    w.setCalendarPopup(true);
    w.show();
    return a.exec();
}
...