首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QDateEdit日历弹出窗口

QDateEdit日历弹出窗口
EN

Stack Overflow用户
提问于 2011-08-12 03:52:34
回答 5查看 25.3K关注 0票数 3

我正在尝试获取一个允许QCalendarWidget在请求时显示的QDateEdit (而不仅仅是单击向下箭头)。例如,在我的课堂上,我应该能够说:

代码语言:javascript
复制
ui.datepicker.showCalendar()

并且它应该加载显示在日期选择器正下方的日历。

看起来我需要创建QDateEdit的子类,因为这不起作用:

代码语言:javascript
复制
QDateEdit *de = new QDateEdit();
de->calendarWidget()->show();

当你浏览Qt的QDateTimeEdit.cpp源码时,我也试过发送键盘命令,但我的键盘快捷键似乎被禁用了。

我需要对子类做些什么才能让它工作,有什么想法吗?我在想像这样的东西:

代码语言:javascript
复制
class MyDateEdit : QDateEdit
{
  Q_OBJECT

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

但遗憾的是,这似乎也不能编译或正常工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-19 00:00:57

我能够自己弄明白--仍然不确定如何让QDateEdit正常工作,但我使用了QLineEdit,它满足了我的需求。只需将QCalendarWidget的"onClick(QDate)“连接到您创建的执行以下操作的插槽:

代码语言:javascript
复制
setText(date.toString("M/d/yyyy"));
ui->calendar->hide();

然后使用执行“ui->calendar-> QLineEdit ();”的"OnFocusIn“事件向QLineEdit添加事件过滤器。请参阅:Get a notification/event/signal when a Qt widget gets focus

票数 2
EN

Stack Overflow用户

发布于 2013-07-31 15:11:27

在QDateTimeEdit中启用"setCalendarPopup ( bool Enable )“允许弹出日历

票数 12
EN

Stack Overflow用户

发布于 2015-09-03 06:09:43

@Rob S answer

对于事件过滤器方法,您是对的,我们将对QDateEdit执行同样的操作。

我正在编写代码,它扩展了您使用QDateEdit的方法:

在mainwindow.h中,我创建了一个QCalendar指针(使用QtCreator)

以下是mainwindow.cpp的代码(我给出了完整的代码,以便像我这样的新手可以从中受益)

确保将buttonSymbol和calendarpopup属性设置为false以使其正常工作

代码语言:javascript
复制
#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;
}

OR ::或者我们可以使用dateEdit提供的弹出窗口,尽管它的效率不高,因为将其设置为弹出窗口会扰乱其内部。如果你想要,那就试试吧

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7031962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档