一、应用截图
图中第一个黄色按钮为程序托盘显示图标。
二、代码
程序是在 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;
}
}