Qt入门学习之常用界面设计组件(四)

1.时间日期与定时器

I. 时间日期
时间日期是经常遇到的数据类型,Qt中时间日期类型如下:
QTime:时间数据类型,仅表示时间,如:15:32:19(时:分:秒)
QDate:日期数据类型,仅表示日期,如:2017-4-5(年-月-日)
QDateTime:日期时间数据类型,表示日期和时间,如2017-03-23 08:12:43(年-月-日 时:分:秒)

Qt中专门用于日期、时间编辑和显示的界面组件如下:
QTimeEdit:编辑和显示时间的组件
QDateEdit:编辑和显示日期的组件
QDateTimeEdit:编辑和显示日期时间的组件
QCalendarWidget:一个用日历形式选择日期的组件

II. 定时器
定时器是用来处理周期性时间的一种对象,类似于硬件定时器。
如设置一个定时器周期为1000ms,那么每隔1000ms就会发射定时器的timeout()信号,在信号关联的槽函数可以做相应的处理。Qt中的QTimer是直接从QObject类继承而来,不是界面组件类。

III. 日期时间数据与字符串之间的转换

  • 时间、日期编辑器属性设置
    QTimeEdit、QDateEdit都从QDateTimeEdit继承而来,实现对日期和时间特定显示功能。QDateEditQTimeEdit的显示功能都可以通过QDateTimeEdit实现,只需要设置好相关属性即可。
    QDateTimeEdit类的主要属性如下:
    datetime:日期时间。
    date:日期,设置datetime时候会自动改变date,修改date也会自动改变datetime里的日期。
    time:时间,time与datetime的关系与date与datetime的关系类似。
    maxmumDateTime、minmumDateTime:最大、最小日期时间
    maxmumDate、minmumDate:最大、最小日期
    maxmumTime、minmumTime:最大、最小时间
    currentSection:当前输入光标所在的时间日期数据段,是枚举类型QDateTimeEdit::Section段值。如输入光标在yearSection段,就修改“年”的值。
    currentSectionIndex:用序号表示输入光标所在的段
    calendarPopup:是否允许弹出一个日历选择框。当取值为true时,右侧的输入按钮变成与QCombox类似的下拉按钮,单机按钮时出现一个日历选择框,用于在日历上选择日期。对于QTimeEdit无效
    displayFormat:显示格式,日期时间数据的显示格式,如:“yyyy-mm-dd HH:mm:ss”

- 日期时间数据的获取与转换为字符串
以如图所示的例子讲解
在这里插入图片描述
如图所示,在"日期时间"Groupbox中使用QTimeEdit,QDateEdit,QDateTimeEdit组件做为时间、日期、日期时间的编辑器。在其右侧放置一个QLineEdit组件用于字符串的显示,具体代码如下:

   //创建QGroupBox类对象groupbox2,并设置相关属性
    groupBox_2 = new QGroupBox(Dialog);
    groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
    //创建QGridLayout类对象gridLayout
    gridLayout = new QGridLayout(groupBox_2);
    gridLayout->setSpacing(6);
    gridLayout->setContentsMargins(11, 11, 11, 11);
    gridLayout->setObjectName(QStringLiteral("gridLayout"));
    //创建QLabel对象label2
    label_2 = new QLabel(groupBox_2);
    label_2->setObjectName(QStringLiteral("label_2"));
    //将label2添加到网格布局管理器中
    gridLayout->addWidget(label_2, 2, 0, 1, 1);
    
    //创建QTimeEdit对象timeEdit
    timeEdit = new QTimeEdit(groupBox_2);
    timeEdit->setObjectName(QStringLiteral("timeEdit"));
    timeEdit->setCalendarPopup(true);
    timeEdit->setTime(QTime(15, 30, 55));
    //将timeEdit添加到网格布局管理器中
    gridLayout->addWidget(timeEdit, 1, 1, 1, 1);
    
   /*后续代码类似*/
    label_3 = new QLabel(groupBox_2);
    label_3->setObjectName(QStringLiteral("label_3"));                                                      
    gridLayout->addWidget(label_3, 3, 0, 1, 1);

    btnSetDate = new QPushButton(groupBox_2);
    btnSetDate->setObjectName(QStringLiteral("btnSetDate"));
    gridLayout->addWidget(btnSetDate, 2, 4, 1, 1);

    btnSetDateTime = new QPushButton(groupBox_2);
    btnSetDateTime->setObjectName(QStringLiteral("btnSetDateTime"));
    gridLayout->addWidget(btnSetDateTime, 3, 4, 1, 1);

    label = new QLabel(groupBox_2);
    label->setObjectName(QStringLiteral("label"));
    gridLayout->addWidget(label, 1, 0, 1, 1);

    dateEdit = new QDateEdit(groupBox_2);
    dateEdit->setObjectName(QStringLiteral("dateEdit"));
    dateEdit->setCurrentSection(QDateTimeEdit::YearSection);
    dateEdit->setCalendarPopup(true);
    dateEdit->setCurrentSectionIndex(0);
    dateEdit->setDate(QDate(2016, 11, 21));
    gridLayout->addWidget(dateEdit, 2, 1, 1, 1);

    btnSetTime = new QPushButton(groupBox_2);
    btnSetTime->setObjectName(QStringLiteral("btnSetTime"));
    gridLayout->addWidget(btnSetTime, 1, 4, 1, 1);

    editTime = new QLineEdit(groupBox_2);
    editTime->setObjectName(QStringLiteral("editTime"));
    gridLayout->addWidget(editTime, 1, 3, 1, 1);

    editDate = new QLineEdit(groupBox_2);
    editDate->setObjectName(QStringLiteral("editDate"));
    gridLayout->addWidget(editDate, 2, 3, 1, 1);

    btnGetTime = new QPushButton(groupBox_2);
    btnGetTime->setObjectName(QStringLiteral("btnGetTime"));
    gridLayout->addWidget(btnGetTime, 0, 0, 1, 2);

    horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    gridLayout->addItem(horizontalSpacer_2, 2, 2, 1, 1);

    editDateTime = new QLineEdit(groupBox_2);
    editDateTime->setObjectName(QStringLiteral("editDateTime"));
    editDateTime->setMinimumSize(QSize(150, 0));
    gridLayout->addWidget(editDateTime, 3, 3, 1, 1);

    dateTimeEdit = new QDateTimeEdit(groupBox_2);
    dateTimeEdit->setObjectName(QStringLiteral("dateTimeEdit"));
    dateTimeEdit->setMinimumSize(QSize(160, 0));
    dateTimeEdit->setDateTime(QDateTime(QDate(2018, 10, 9), QTime(8, 21, 28)));
    dateTimeEdit->setDate(QDate(2018, 10, 9));
    dateTimeEdit->setTime(QTime(8, 21, 28));
    dateTimeEdit->setMaximumDateTime(QDateTime(QDate(3000, 12, 31), QTime(23, 59, 59)));
    dateTimeEdit->setMinimumDateTime(QDateTime(QDate(1763, 9, 14), QTime(0, 0, 0)));
    dateTimeEdit->setMinimumDate(QDate(1763, 9, 14));
    dateTimeEdit->setCurrentSection(QDateTimeEdit::YearSection);
    dateTimeEdit->setCalendarPopup(false);
    dateTimeEdit->setCurrentSectionIndex(0);
    dateTimeEdit->setTimeSpec(Qt::LocalTime);
    gridLayout->addWidget(dateTimeEdit, 3, 1, 1, 1);

    LabDateTime = new QLabel(groupBox_2);
    LabDateTime->setObjectName(QStringLiteral("LabDateTime"));
    LabDateTime->setAlignment(Qt::AlignCenter);
    gridLayout->addWidget(LabDateTime, 0, 3, 1, 1)

“读取当前日期时间”按钮的"clicked()"信号的槽函数,代码如下:

void Dialog::on_btnGetTime_clicked()
{ //获取当前日期时间,为三个专用编辑器设置日期时间数据,并转换为字符串在LineEdit里显示
    QDateTime curDateTime=QDateTime::currentDateTime(); //读取当前日期时间
    ui->timeEdit->setTime(curDateTime.time()); //设置时间
    ui->editTime->setText(curDateTime.toString("hh:mm:ss"));//转换为字符串显示
    ui->dateEdit->setDate(curDateTime.date());//设置日期
    ui->editDate->setText(curDateTime.toString("yyyy-MM-dd"));//转换为字符串显示
    ui->dateTimeEdit->setDateTime(curDateTime);//设置日期时间
    ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));//转换为字符串显示
 }

QDateTimeEdit::toString()函数将日期时间数据按照指定的格式转换为字符串。如:
ui->editTime->setText(curDateTime.toString(“hh:mm:ss”));//转换为字符串显示
格式是一个字符串。在设置日期时间显示字符串格式时,还可以使用填字符,甚至汉字,如:
curDateTime.toString(“yyyy年mm月dd日”);
字符串同样可以转化为QDate、QTime、QDateTime类型,使用QDateTime::fromString()静态函数
QDateTime QDateTime::fromString(const QString &string,const QString &format)
string:第一个参数string是待转换成日期时间的字符串形式
format:第二个参数format是字符串转换成日期时间后表示的格式
如设置日期,代码如下:

void Dialog::on_btnSetDate_clicked()
{   //字符串转换为 QDate
    QString str=ui->editDate->text(); //读取字符串表示的日期
    if (!str.isEmpty())
    {
        QDate dt=QDate::fromString(str,"yyyy-MM-dd");//从字符串转换为 QDate
        ui->dateEdit->setDate(dt);//设置日期
    }
}

IV. QCalendarWidget日历组件
在这里插入图片描述
如图所示,在"日期时间"Groupbox中使用QCalendarWidget组件显示日期,也可用于日期的选择。在其上方放置一个QLineEdit组件用于字符串的显示,具体代码如下:

    groupBox_3 = new QGroupBox(Dialog);
    groupBox_3->setObjectName(QStringLiteral("groupBox_3"));
    gridLayout_3 = new QGridLayout(groupBox_3);
    gridLayout_3->setSpacing(6);
    gridLayout_3->setContentsMargins(11, 11, 11, 11);
    gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
    
    editCalendar = new QLineEdit(groupBox_3);
    editCalendar->setObjectName(QStringLiteral("editCalendar"));
    gridLayout_3->addWidget(editCalendar, 0, 1, 1, 1);

    calendarWidget = new QCalendarWidget(groupBox_3);
    calendarWidget->setObjectName(QStringLiteral("calendarWidget"));
    calendarWidget->setGridVisible(false);
    gridLayout_3->addWidget(calendarWidget, 1, 0, 1, 2);

    label_5 = new QLabel(groupBox_3);
    label_5->setObjectName(QStringLiteral("label_5"));
    gridLayout_3->addWidget(label_5, 0, 0, 1, 1);

QCalendarWidget有一个信号selectionChanged()信号,在日历上选择的日期变化后货发射次信号,相关槽函数如下:

 void Dialog::on_calendarWidget_selectionChanged()
{ //在日历上选择日期
    QDate dt=ui->calendarWidget->selectedDate(); //读取选择的日期时间
    QString str=dt.toString("yyyy年M月d日");//转换为字符串
    ui->editCalendar->setText(str); //字符串显示日期
}

V. 定时器的使用
Qt中的定时器时QTimer,不是一个可见的界面组件。QTimer主要的属性是interval,是定时器的中断周期,单位是毫秒。QTimer主要信号是timeout(),在定时器中断发生的时候发射此信号。
定义一个定时器fTimer,一个计时器fTimerCounter。还定义一个槽函数on_timer_timeout(),作为定时器的timeout()信号的响应槽函数。
注意:因为QTimer不是一个可见的界面组件,所以需要在窗口类的构造函数中创建定时器,并进行信号和槽函数的关联。
在这里插入图片描述

class Dialog : public QDialog
{
    Q_OBJECT
private:
    QTimer *fTimer;  //定时器
    QTime   fTimeCounter;//计时器
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private slots:
    void on_timer_timeout(); //定时器中断处理槽函数
}
/*******************************窗口类构造函数**********************************/
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
    ui->setupUi(this);
    fTimer=new QTimer(this);  //创建定时器
    fTimer->stop();
    fTimer->setInterval(1000);//设置定时周期,单位:毫秒
    connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); //关联定时器的信号与槽
}
/*******************************槽函数**********************************/
void Dialog::on_timer_timeout()
{ //定时器中断响应槽函数
  QTime curTime=QTime::currentTime(); //获取当前时间
  
  ui->LCDHour->display(curTime.hour()); //显示  小时
  ui->LCDMin->display(curTime.minute());//显示  分钟
  ui->LCDSec->display(curTime.second());//显示  秒
  
  int va=ui->progressBar->value(); //读取progressBar的数值
  va++;
  if (va>100){va=0;}
 ui->progressBar->setValue(va); //设置progressBar的数值
}

QTimer常用的成员函数:
Qtimer::currentTime()获取当前时间
QTimer::hour()获取小时
QTimer::minute()获取分钟
QTimer::second()获取秒
QTimer::setInterval()设置定时器的周期。
QTimer::start()启动定时器
QTimer::stop()停止定时器

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值