QDateEdit календарь всплывающее окно - PullRequest
2 голосов
/ 11 августа 2011

Я пытаюсь получить 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();
  }
};

Но, увы, это также, похоже, не компилируется или работает неправильно.

Ответы [ 3 ]

10 голосов
/ 31 июля 2013

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

1 голос
/ 18 августа 2011

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

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

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

0 голосов
/ 03 сентября 2015

@ Роб С ответ

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

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

В mainwindow.h я создал указатель QCalendar (используя QtCreator)

Ниже приведен код mainwindow.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, хотя это не очень эффективно, так как перенаправление его в Popup будет портить его внутреннее. Дайте ему шанс, если хотите

#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;
}
...