3

(下矢印をクリックするだけでなく)要求されたときにを表示QDateEditできるようにしようとしています。QCalendarWidgetたとえば、私のクラスのどこかで、次のように言うことができるはずです。

ui.datepicker.showCalendar()

日付ピッカーのすぐ下に表示されるカレンダーが読み込まれるはずです。

QDateEditこれは機能しないため、サブクラス化する必要があるようです。

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

QtのQDateTimeEdit.cppソースを調べたときに、指示どおりにキーボードコマンドを送信しようとしましたが、キーボードショートカットが無効になっているようです。

これを機能させるためにサブクラスに何をしなければならないかについてのアイデアはありますか?私は次のようなことを考えていました:

class MyDateEdit : QDateEdit
{
  Q_OBJECT

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

しかし、残念ながら、それもコンパイルされていないか、正しく機能していないようです。

4

5 に答える 5

12

QDateTimeEditで「setCalendarPopup(bool enable)」を有効にすると、カレンダーをポップアップできます

于 2013-07-31T07:11:27.207 に答える
2

私は自分でそれを理解することができました-QDateEditを正しく機能させる方法はまだわかりませんが、QLineEditを使用し、それは私のニーズに合っていました。QCalendarWidgetの「onClick(QDate)」を作成したスロットに接続するだけで、次のことができます。

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

次に、「ui-> calendar-> show();」を実行する「OnFocusIn」イベントを使用して、QLineEditにイベントフィルターを追加します。参照:Qtウィジェットがフォーカスを取得したときに通知/イベント/シグナルを取得する

于 2011-08-18T16:00:56.600 に答える
0

@RobSの回答

あなたは、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;
}

または::または、dateEditが提供するQCalendarWidgetを使用することもできますが、ポップアップに合わせると内部が混乱するため、あまり効率的ではありません。必要に応じて試してみてください

#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;
}
于 2015-09-02T22:09:43.063 に答える
0

@Drと同様のオプションを提供したいと思います。QDateEditサブクラスにカレンダーウィジェットをカプセル化するXperienceの回答:

#include <QDateEdit>
#include <QCalendarWidget>

class DateEdit : public QDateEdit {
    Q_OBJECT

public:
    explicit DateEdit(QWidget *parent = nullptr);

protected:
    virtual void focusInEvent(QFocusEvent *event) override;

private:
    QCalendarWidget *calendar = new QCalendarWidget(this);
};

DateEdit::DateEdit(QWidget *parent) : QDateEdit (parent) {
    setButtonSymbols(QAbstractSpinBox::NoButtons);
    setCalendarPopup(false);
    setDate(QDate::currentDate());

    calendar->setWindowFlags(Qt::Popup);
    connect(calendar, &QCalendarWidget::clicked, this, [&](const QDate &date) {
        setDate(date);
        calendar->hide();
    });
}

void DateEdit::focusInEvent(QFocusEvent *event) {
    if (!calendar->isVisible()) {
        calendar->setSelectedDate(date());
        calendar->move(mapToGlobal(QPoint(0, height())));
        calendar->show();
    }

    return QDateEdit::focusInEvent(event);
}

警告: QtDesignerを使用してこのウィジェットを配置すると、buttonSymbolsおよびcalendarPopupプロパティが上書きされるため、QDateEditのボタンを非表示にするには手動で設定する必要があります。

于 2019-07-28T16:14:51.293 に答える
0

これがこの問題に対する私のハッキーなアプローチです。何かをきれいにするためにかなり長い間戦った後、私はのソースコードQDateEditor(実際には単純化されたものQDateTimeEditorです)を読みましたが、それはきれいな解決策ではないようです。toggle()以下はではなくのコードですshow()が、それでも:

// Enable the calendar popup
date_editor->setCalendarPopup(true);

// Show the calendar popup by default
// There seems to be no proper interface to achieve that
// Fake a mouse click on the right-hand-side button
QPointF point = date_editor->rect().bottomRight() - QPointF{5, 5};
QCoreApplication::postEvent(
    date_editor,
    new QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton,
                    Qt::LeftButton, Qt::NoModifier));

このようなものを使用すると、エディターの検証機能に依存し続けることができます。

ところで、ビルトインエディタのもう1つの厄介な点QLineEditは、(少なくとも私の場合は)キーボードカーソルがデフォルトで表示されないことです。これは非常に紛らわしいです。これを解決するために私はしました:

// Select a section so that the cursor is be visible
date_editor->setSelectedSection(QDateTimeEdit::DaySection);

これまたはコースは日付の曜日セクションを選択しますが、キーボードの矢印を使用すると選択は消えますが、キーボードカーソルが表示されます。

于 2019-08-27T17:12:20.640 に答える