Qt小例子学习56 - QLineEdit获取日历日期
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QQmlEngine;
class QQmlComponent;
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
bool eventFilter(QObject *watched, QEvent *event);
private:
void showCalendar();
Q_SLOT void onSelectedDate();
QObject *dialog = Q_NULLPTR;
QQmlEngine *engine;
QQmlComponent *component;
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDate>
#include <QEvent>
#include <QLineEdit>
#include <QQmlComponent>
#include <QQmlEngine>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->installEventFilter(this);
engine = new QQmlEngine(this);
component = new QQmlComponent(
engine, QUrl(QStringLiteral("qrc:/popupCalendar.qml")), this);
}
MainWindow::~MainWindow() { delete ui; }
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if (watched == ui->lineEdit)
{
if (event->type() == QEvent::MouseButtonPress)
{
showCalendar();
}
}
return QMainWindow::eventFilter(watched, event);
}
void MainWindow::showCalendar()
{
if (dialog == Q_NULLPTR)
{
dialog = component->create();
int index = dialog->metaObject()->indexOfProperty("selectedDate");
const QMetaProperty property = dialog->metaObject()->property(index);
if (property.hasNotifySignal())
{
const QMetaMethod s = property.notifySignal();
QString sig = QString("2%1").arg(QString(s.methodSignature()));
connect(dialog, sig.toStdString().c_str(), this, SLOT(onSelectedDate()));
}
}
QMetaObject::invokeMethod(dialog, "show",
Q_ARG(QVariant, QVariant(QDate::currentDate())));
}
void MainWindow::onSelectedDate()
{
ui->lineEdit->setText(dialog->property("selectedDate").toDate().toString());
ui->lineEdit->adjustSize();
}
popupCalendar.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
Dialog {
id: dialogCalendar
property date selectedDate: new Date()
width: 250
height: 300
contentItem: Rectangle {
id: dialogRect
color: "#f7f7f7"
Calendar {
id: calendar
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: row.top
style: CalendarStyle {
navigationBar: Rectangle {
height: 48
color: "#f7f7f7"
Rectangle {
color: "#d7d7d7"
height: 1
width: parent.width
anchors.bottom: parent.bottom
}
Button {
id: previousMonth
width: parent.height - 8
height: width
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 8
onClicked: control.showPreviousMonth()
style: ButtonStyle {
background: Rectangle {
color: "#f7f7f7"
Image {
source: control.pressed ? "left_arrow_disable.png" : "left_arrow.png"
width: parent.height - 8
height: width
}
}
}
}
Label {
id: dateText
text: styleData.title
color: "#34aadc"
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 16
anchors.verticalCenter: parent.verticalCenter
anchors.left: previousMonth.right
anchors.leftMargin: 2
anchors.right: nextMonth.left
anchors.rightMargin: 2
}
Button {
id: nextMonth
width: parent.height - 8
height: width
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
onClicked: control.showNextMonth()
style: ButtonStyle {
background: Rectangle {
color: "#f7f7f7"
Image {
source: control.pressed ? "right_arrow_disable.png" : "right_arrow.png"
width: parent.height - 8
height: width
}
}
}
}
}
dayDelegate: Rectangle {
anchors.fill: parent
anchors.margins: styleData.selected ? -1 : 0
color: styleData.date !== undefined && styleData.selected ? selectedDateColor : "transparent"
readonly property color sameMonthDateTextColor: "#444"
readonly property color selectedDateColor: "#34aadc"
readonly property color selectedDateTextColor: "white"
readonly property color differentMonthDateTextColor: "#bbb"
readonly property color invalidDateColor: "#dddddd"
Label {
id: dayDelegateText
text: styleData.date.getDate()
anchors.centerIn: parent
horizontalAlignment: Text.AlignRight
font.pixelSize: 10
color: {
var theColor = invalidDateColor; // Устанавливаем невалидный цвет текста
if (styleData.valid) {
theColor = styleData.visibleMonth ? sameMonthDateTextColor : differentMonthDateTextColor;
if (styleData.selected)
theColor = selectedDateTextColor;
}
theColor;
}
}
}
}
}
Row {
id: row
height: 48
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
Button {
id: dialogButtonCalCancel
anchors.top: parent.top
anchors.bottom: parent.bottom
width: parent.width / 2 - 1
style: ButtonStyle {
background: Rectangle {
color: control.pressed ? "#d7d7d7" : "#f7f7f7"
border.width: 0
}
label: Text {
text: qsTr("Cancel")
font.pixelSize: 14
color: "#34aadc"
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
}
}
onClicked: dialogCalendar.close()
}
Rectangle {
id: dividerVertical
width: 2
anchors.top: parent.top
anchors.bottom: parent.bottom
color: "#d7d7d7"
}
Button {
id: dialogButtonCalOk
anchors.top: parent.top
anchors.bottom: parent.bottom
width: parent.width / 2 - 1
style: ButtonStyle {
background: Rectangle {
color: control.pressed ? "#d7d7d7" : "#f7f7f7"
border.width: 0
}
label: Text {
text: qsTr("Ok")
font.pixelSize: 14
color: "#34aadc"
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
}
}
onClicked: {
dialogCalendar.selectedDate = calendar.selectedDate
dialogCalendar.close()
}
}
}
}
function show(x){
calendar.selectedDate = x
dialogCalendar.open()
}
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}