0

QLineEdit と QCalendar をサブクラス化して日付入力を作成しました。mousePressEvent が QLineEdit で受信されると、カレンダーが QLineEdit の下部に表示されます。問題は、そのカレンダーを非表示にすることです。ユーザーが別の場所をクリックしたときにフォーカスを閉じたいので、その focusOutEvent をオーバーライドしました。しかし、このイベントはまったく受信されません。ブレークポイントを入れることでこれを確認しました。そこで止まることはありません。私はそれに呼び出しを入れましclose()た:

class MyCalendarWidget : public QCalendarWidget
{
    Q_OBJECT

public:
    void focusOutEvent(QFocusEvent* e)
    {
        close();
    }
};

DateLineEdit から閉じると、期待どおりに動作します。

void DateLineEdit::mousePressEvent(QMouseEvent *)
{
    if (calendar->isVisible())
    {
        calendar->close();
    }
    else
    {
        calendar->move(mapToGlobal(QPoint(0, height())));
        calendar->show();
    }
}
4

2 に答える 2

1

Qtにはすでにそのようなものがあることを知っていますか?QDateTimeEditクラスのsetCalendarPopup()およびsetCalendarWidget()を参照してください。私が今できる唯一の違いは、カレンダーを表示するには、ユーザーが編集行ではなくウィジェットの右側をクリックする必要があることです。

お役に立てれば

于 2011-04-02T12:15:12.500 に答える
1

そもそもフォーカスがなかったので、 focusOutEvent を送信していないと思います。ユーザーが後で DateLineEdit に何かを入力した場合は、そうではありません。DateLineEdit オブジェクトから focusOutEvent を取得し、その時点でカレンダーを閉じます。ただし、ユーザーがカレンダーをクリックしたかどうか (この場合、フォーカスがあるか、少なくとも mousePressEvent を受信したかどうか) をテストし、その場合はそのままにしておきます (それ以外の場合は閉じます)。

于 2011-04-02T00:42:45.623 に答える