Всплывающее окно календаря QDateEdit



Я пытаюсь получить QDateEdit, чтобы разрешить QCalendarWidget показывать при запросе (а не просто при нажатии на стрелку вниз). Например, где-то в моем классе я должен быть в состоянии сказать:



ui.datepicker.showCalendar()


И он должен загрузить календарь, который появляется прямо под средством выбора даты.



Похоже, мне нужен подкласс QDateEdit, так как это не работает:



QDateEdit *de = new QDateEdit();
de->calendarWidget()->show();


Я также пробовал отправлять команды клавиатуры, как диктовалось, когда вы проходите через QDateTimeEdit.cpp источник для Qt, но кажется мой сочетания клавиш отключены или что-то в этом роде.



Есть идеи о том, что я должен сделать с подклассом, чтобы заставить его работать? Я думал о чем-то вроде:



class MyDateEdit : QDateEdit
{
Q_OBJECT

protected:
void mouseEvent(QEvent *event) {
this.calendarWidget().show();
}
};


Но, увы, это также не похоже на компиляцию или корректную работу.
737   3  

3 ответов:

Включить "setCalendarPopup (bool enable )" в QDateTimeEdit позволяет всплывающее окно календаря

Я смог разобраться в этом самостоятельно - до сих пор не знаю, как заставить QDateEdit работать должным образом, но я использовал QLineEdit, и он соответствовал моим потребностям. Просто подключите QCalendarWidget "onClick (QDate)" к слоту, который вы создаете, что делает a:

setText(date.toString("M/d/yyyy"));
ui->calendar->hide();

Затем добавьте фильтр событий в QLineEdit, используя событие "OnFocusIn", которое делает "ui - > calendar - >show ();" смотрите: получить уведомление / событие / сигнал, когда виджет Qt получает фокус

@Rob S Ответ

Вы были правы с подходом фильтра событий, мы бы сделали то же самое с QDateEdit.

Я пишу код, который расширяет ваш подход с помощью QDateEdit:

в главном окне.h я создал указатель QCalendar (используя QtCreator)

ниже приведен код главного окна.cpp (я даю полный код, чтобы новички вроде меня могли извлечь из него выгоду)

Убедитесь, что вы задали свойству buttonSymbol и calendarpopup значение false, чтобы заставить его работать правильно

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCalendarWidget>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->dateEdit->setDate(QDate::currentDate());

    widget=new QCalendarWidget(); //widget is QCalendar pointer

    ui->verticalLayout->addWidget(widget);
    widget->setWindowFlags(Qt::Popup); // we need widget to popup 

    ui->dateEdit->installEventFilter(this);
    connect(widget,SIGNAL(clicked(QDate)),ui->dateEdit,SLOT(setDate(QDate)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (event->type() == QEvent::InputMethodQuery)
    {
        if (object == ui->dateEdit)
        {

          if(widget->isVisible()==false && ui->dateEdit->calendarWidget()->isVisible()==false) // this done to avoid conflict
          {
                qWarning(QString().number(event->type()).toStdString().c_str());
                qWarning(object->objectName().toLatin1().data());
                widget->move(ui->dateEdit->mapToGlobal(QPoint(0,ui->dateEdit->height())));
                widget->show();
          }

        }

    }
    return false;
}

Или:: альтернативно мы можем использовать QCalendarWidget, предоставленный dateEdit, хотя его не очень эффективно, как Тьюринг его всплывающее окно будет возиться с его внутренней. Попробуй, если хочешь

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCompleter>
#include <QCalendarWidget>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->dateEdit->setDate(QDate::currentDate());

    widget = ui->dateEdit->calendarWidget();
    widget->setWindowFlags(Qt::Popup);

    ui->dateEdit->installEventFilter(this);

    //connecting widget with dateedit
    ui->dateEdit->setButtonSymbols(QAbstractSpinBox::NoButtons);
    ui->dateEdit->setCalendarPopup(true);

    connect(widget,SIGNAL(clicked(QDate)),ui->dateEdit,SLOT(setDate(QDate)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->dateEdit)
    {
        if (event->type() == QEvent::FocusIn || event->type() == QEvent::MouseButtonPress)
        {    
           // WE NEED MOUSE EVENT TO AVOID INTERFERNCE WITH CALENDAR POPUP BUTTON SITUATED AT CORNER OF dateEdit WIDGET
            if(widget->isVisible()==false && ( ((QMouseEvent* )event)->x()< (ui->dateEdit->width()-10)))
            {
                widget->move(ui->dateEdit->mapToGlobal(QPoint(0,ui->dateEdit->height())));
                widget->show();
            }
        }    
    }
    return false;
}

Comments

    Ничего не найдено.