开篇一张图:
接下来全靠编。
上图就是我这次做的闹钟的主界面图了,先简单的说下功能和流程:
这个闹钟可以设置时间和设置闹钟,在闹钟的时间到达时会播放一首歌,也可以关掉。
设置的时间是直接硬件设置到rtc,然后更新到系统时间里。
程序的主要资源在上图,都是前面写好的bsp包和lib库。
接下来我们看下程序:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置背景图
// QPalette Palette;
// Palette.setBrush(QPalette::Background, QBrush(QPixmap(":/w_black.jpeg").scaled(this->size())));
// this->setPalette(Palette);
stop_alarm = new QPushButton(this);
stop_alarm->setIcon(QIcon(":/alarm.jpeg"));
stop_alarm->setIconSize(QSize(70, 70));
stop_alarm->setGeometry(QRect(380, 240, 70, 70));
stop_alarm->setFlat(true); //透明效果
stop_alarm->hide();
//初始化音量
//system("amixer cset numid=11 120");
set_alarm_flag = 0;
QTimer *Is300ms_timer = new QTimer(this);
connect(Is300ms_timer, SIGNAL(timeout()), this, SLOT(showtime()));
connect(&alc_dlg, &alc_set::setAlarm, this, &Widget::alarm_slot);
connect(stop_alarm, &QPushButton::clicked, this, &Widget::close_alarm);
Is300ms_timer->start(300);
}
主窗口程序首先设置来一个透明按钮是为了用于控制闹钟暂停,平时是隐藏的。
第一个connect是用来更新系统时间的,之所以设置300ms是为了比较闹钟时间,按理是应该分开来写的,但是我这偷了个懒。
第二个conncet是用来接受闹钟设置对话框设置,得到的闹钟时间。
第三个connect是用来处理那个闹钟停止按钮的。
用了个重绘事件绘制背景图。
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0, 0, width(), height(),QPixmap(":/w_black.jpeg"));
}
void Widget::showtime()
{
QTime time = QTime::currentTime();
QString times = time.toString("hh:mm:ss");
ui->lcdNumber->display(times);
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");
ui->timeshow->setText(current_date);
if (set_alarm_flag == 1) {
//qDebug() << time;
//如果闹钟时间到了会返回一个小于零的数
if ( time.secsTo(alarm_time) < 0) {
set_alarm_flag = 0;
//闹钟到
QString program = "aplay";
QStringList argvc("music_20s.wav");
audo.start(program, argvc);
stop_alarm->show();
//qDebug() << "time out";
}
}
}
void Widget::alarm_slot(const QTime &time)
{
set_alarm_flag = 1; //设置闹钟标志
alarm_time = time; //保存闹钟时间
// qDebug() << alarm_time;
}
void Widget::close_alarm()
{
audo.close(); //关闭正在播放的歌曲
stop_alarm->hide(); //隐藏按钮
}
void Widget::on_pushButton_clicked()
{
alc_dlg.show(); //显示闹钟设置对话框
}
void Widget::on_pushButton_2_clicked()
{
sys_dlg.show(); //显示系统时间设置对话框
}
闹钟设置对话框界面:
比较简单,没用样式表。
这个对话框的构造函数如下:
alc_set::alc_set(QWidget *parent) :
QDialog(parent),
ui(new Ui::alc_set)
{
ui->setupUi(this);
ui->timeEdit->setDisplayFormat("hh:mm:ss");
//设置背景图
QPalette Palette;
Palette.setBrush(QPalette::Background, QBrush(QPixmap(":/w_black.jpeg").scaled(this->size())));
this->setPalette(Palette);
}
void alc_set::on_buttonBox_accepted()
{
//发送一个信号给主窗口
emit setAlarm(save_time);
}
void alc_set::on_timeEdit_timeChanged(const QTime &time)
{
save_time = time;
}
这个和设置闹钟流程差不多:
先构造了构造函数:
sys_set::sys_set(QWidget *parent) :
QDialog(parent),
ui(new Ui::sys_set)
{
ui->setupUi(this);
ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
set_systime = QDateTime::currentDateTime();
//设置背景图
QPalette Palette;
Palette.setBrush(QPalette::Background, QBrush(QPixmap(":/w_black.jpeg").scaled(this->size())));
this->setPalette(Palette);
}
void sys_set::on_buttonBox_accepted()
{
QString times = set_systime.toString("yyyy-MM-dd hh:mm:ss");
const char *tmp = times.toStdString().data();
//设置RTC
int dev_fd = rtc_init_time(tmp);
rtc_deinit(dev_fd);
//同步到系统时间
system("hwclock -s");
}
void sys_set::on_dateTimeEdit_dateTimeChanged(const QDateTime &dateTime)
{
//保存系统设置的时间
set_systime = dateTime;
}