imx6ul+QT闹钟

开篇一张图:

imx6ul+QT闹钟_第1张图片

接下来全靠编。

上图就是我这次做的闹钟的主界面图了,先简单的说下功能和流程:
这个闹钟可以设置时间和设置闹钟,在闹钟的时间到达时会播放一首歌,也可以关掉。
设置的时间是直接硬件设置到rtc,然后更新到系统时间里。

imx6ul+QT闹钟_第2张图片

程序的主要资源在上图,都是前面写好的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"));
    }

这就是第一个connect的槽函数,用来显示系统时间和比较闹钟时间:
    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(); //显示系统时间设置对话框
}

闹钟设置对话框界面:

imx6ul+QT闹钟_第3张图片

比较简单,没用样式表。

这个对话框的构造函数如下:

    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);
    }


先设置啦显示的格式,然后绘制了背景图。

第一个槽函数,就是响应对话框的ok
第二个槽函数用于保存改变的时间,不过主要取决与是否最后点击了ok按钮没有。

void alc_set::on_buttonBox_accepted()
{
    //发送一个信号给主窗口
    emit setAlarm(save_time);
}

void alc_set::on_timeEdit_timeChanged(const QTime &time)
{
    save_time = time;
}

为什么这些没有设置connect是因为直接在ui上右击控件选择了转到槽。
这样他就自动连接了。

设置系统时间的对话框:

imx6ul+QT闹钟_第4张图片

这个和设置闹钟流程差不多:
先构造了构造函数:

    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;
    }

这里设置了rtc和更新系统时间。

你可能感兴趣的:(linux学习过程)