qt之定时关机重启助手,带系统托盘控制。

一、应用截图


图中第一个黄色按钮为程序托盘显示图标。

二、代码

程序是在 http://blog.csdn.net/gdutlyp/article/details/50441684 的基础上修改的,添加了系统托盘方便用户查看和修改操作。

 

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //setStyleSheet("background-color:none;border: none;");
    init_sys();
    initSystemTrayIconShow();
    QObject::connect(ui->pushButton_exec,SIGNAL(clicked()),this,SLOT(slot_pushbutton_exec()));
    QObject::connect(ui->pushButton_cancel,SIGNAL(clicked()),this,SLOT(slot_pushbutton_cancel()));
    QObject::connect(&timer,SIGNAL(timeout()),this,SLOT(slot_count_down()));
    QObject::connect(ui->spinBox_hour,SIGNAL(valueChanged(int)),this,SLOT(slot_set_hour()));
    QObject::connect(ui->spinBox_minute,SIGNAL(valueChanged(int)),this,SLOT(slot_set_minute()));
    QObject::connect(ui->spinBox_second,SIGNAL(valueChanged(int)),this,SLOT(slot_set_second()));
}
Widget::~Widget()
{
    delete ui;
}
void Widget::init_sys()
{
    //初始化LCD显示器
    //注:display是重载函数,当希望显示09,08,07……等数字形式时
    //采用字符串形式,可以显示前缀“0”,数字型显示会自动忽略掉0
    ui->lcdNumber_hour->display("88");
    ui->lcdNumber_minute->display("88");
    ui->lcdNumber_second->display("88");
    //设置组合框文本内容的前缀
    ui->spinBox_hour->setPrefix("0");
    ui->spinBox_minute->setPrefix("0");
    ui->spinBox_second->setPrefix("0");
    //初始化组合框文本内容
    ui->spinBox_hour->setValue(0);
    ui->spinBox_minute->setValue(0);
    ui->spinBox_second->setValue(0);
    //停止定时器
    timer.stop();
}
void Widget::slot_pushbutton_exec()
{
    //以索引号模式判断用户做出的选择
    int index_model = ui->comboBox_model->currentIndex();
    int index_action = ui->comboBox_action->currentIndex();
    //以当前选项文本内容判断用户做出的选择
//    QString str_model = ui->comboBox_model->currentText();
//    QString str_action = ui->comboBox_action->currentText();
//    if(str_model = "设定时间")
    if(1==index_model)          //指定关机时间模式
    {
        QString second = ui->spinBox_second->text();
        QString minute = ui->spinBox_minute->text();
        QString hour = ui->spinBox_hour->text();
        QString cmd = "at "+hour+":"+minute+":"+second+" ";
        switch(index_action)
        {
        case 0:                 //关机指令
            cmd = cmd + "shutdown -s";
            break;
        case 1:                 //注销指令
            cmd = cmd + "shutdown -l";
            break;
        case 2:                 //重启指令
            cmd = cmd + "shutdown -r";
            break;
        }
        //将QString类对象转换为char*类型
        char* ch;
        QByteArray ba = cmd.toLatin1();
        ch=ba.data();
        system(ch);     //执行shell命令
    }
    else if(0==index_model)     //倒计时关机模式
    {
        int delay = ui->spinBox_hour->value()*3600 +
                    ui->spinBox_minute->value()*60 +
                    ui->spinBox_second->value();
        QString cmd = "";
        switch(index_action)
        {
        case 0:                 //关机指令
            cmd = "shutdown -s -t "+QString::number(delay);
            break;
        case 1:                 //注销指令
            cmd = "shutdown -l -t "+QString::number(delay);
            break;
        case 2:                 //重启指令
            cmd = "shutdown -r -t "+QString::number(delay);
            break;
        }
        char* ch;
        QByteArray ba = cmd.toLatin1();
        ch=ba.data();
        system(ch);
        //当显示的数字的位数为一位时,需要加上前缀“0”,以达到09,08……的效果
        //当显示的数字为两位数时,则需要屏蔽掉前缀“0”。
        //设置LCD显示小时
        if(ui->spinBox_hour->value()<=9&&ui->spinBox_hour->value()>=0)
            ui->lcdNumber_hour->display("0"+QString::number(ui->spinBox_hour->value()));
        else
            ui->lcdNumber_hour->display(QString::number(ui->spinBox_hour->value()));
        //设置LCD显示分钟
        if(ui->spinBox_minute->value()<=9&&ui->spinBox_minute->value()>=0)
            ui->lcdNumber_minute->display("0"+QString::number(ui->spinBox_minute->value()));
        else
            ui->lcdNumber_minute->display(QString::number(ui->spinBox_minute->value()));
        //设置LCD显示秒
        if(ui->spinBox_second->value()<=9&&ui->spinBox_second->value()>=0)
            ui->lcdNumber_second->display("0"+QString::number(ui->spinBox_second->value()));
        else
            ui->lcdNumber_second->display(QString::number(ui->spinBox_second->value()));
        timer.start(1*1000);
    }
}
void Widget::slot_pushbutton_cancel()
{
    mSysTrayIcon->setToolTip(QObject::trUtf8("定时关机助手"));
    system("shutdown -a");
    qDebug()<<"shutdown -a";
    init_sys();
}
void Widget::slot_count_down()
{
    int hour = ui->lcdNumber_hour->value();
    int minute = ui->lcdNumber_minute->value();
    int second = ui->lcdNumber_second->value();
    second--;
    if(second<0)
    {
        second = 59;
        minute--;
        if(minute<0)
        {
            minute = 59;
            hour--;
            if(hour<0)
            {
                hour = 0;
            }
        }
    }
    if(hour<=9&&hour>=0)
        ui->lcdNumber_hour->display("0"+QString::number(hour));
    else
        ui->lcdNumber_hour->display(QString::number(hour));
    if(minute<=9&&minute>=0)
        ui->lcdNumber_minute->display("0"+QString::number(minute));
    else
        ui->lcdNumber_minute->display(QString::number(minute));
    if(second<=9&&second>=0)
        ui->lcdNumber_second->display("0"+QString::number(second));
    else
        ui->lcdNumber_second->display(QString::number(second));


}
void Widget::slot_set_hour()
{
    if(ui->spinBox_hour->value()>9)
    {
        ui->spinBox_hour->setPrefix("");
    }
    else
    {
        ui->spinBox_hour->setPrefix("0");
    }
}
void Widget::slot_set_minute()
{
    if(ui->spinBox_minute->value()>9)
    {
        ui->spinBox_minute->setPrefix("");
    }
    else
    {
        ui->spinBox_minute->setPrefix("0");
    }
}
void Widget::slot_set_second()
{
    if(ui->spinBox_second->value()>9)
    {
        ui->spinBox_second->setPrefix("");
    }
    else
    {
        ui->spinBox_second->setPrefix("0");
    }
}

void Widget::initSystemTrayIconShow()
{
    //新建QSystemTrayIcon对象
    mSysTrayIcon = new QSystemTrayIcon(this);
    //新建托盘要显示的icon
    QIcon icon = QIcon(":/R/Ok.png");
    //将icon设到QSystemTrayIcon对象中
    mSysTrayIcon->setIcon(icon);
    //当鼠标移动到托盘上的图标时,会显示此处设置的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8("定时关机助手"));
    //给QSystemTrayIcon添加槽函数
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));

    //建立托盘操作的菜单
    createActions();
    createMenu();
    //在系统托盘显示此对象
    mSysTrayIcon->show();
}

void Widget::on_pushButton_clicked()
{
    this->hide();
}

void Widget::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8("显示界面"),this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

void Widget::createMenu()
{
    mMenu = new QMenu(this);
    mMenu->addAction(mShowMainAction);

    mMenu->addSeparator();

    mMenu->addAction(mExitAppAction);

    mSysTrayIcon->setContextMenu(mMenu);
}

void Widget::on_showMainAction()
{
    mSysTrayIcon->deleteLater();//删除图标
    this->show();
}

void Widget::on_exitAppAction()
{
    mSysTrayIcon->deleteLater();//删除图标
    slot_pushbutton_cancel();//取消设定的命令
    exit(0);
}

void Widget::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值