Всплывающее окно календаря 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();
}
};
Но, увы, это также не похоже на компиляцию или корректную работу.
3 ответов:
Я смог разобраться в этом самостоятельно - до сих пор не знаю, как заставить 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