主界面
系统托盘图标
单例运行
exe带图标
1、QLockFile实现单程序运行
1.1、main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString path = QDir::temp().absoluteFilePath("SingleAppTest.lock");
QLockFile lockFile(path);
if (!lockFile.tryLock(100))
{
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText("已有程序在运行。");
msgBox.exec();
return 1;
}
Widget w;
w.show();
a.exec();
return 0;
}
1.2、源文件widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
....
QSystemTrayIcon *tray = new QSystemTrayIcon(this);
QIcon icon("./pencil.png");
tray->setIcon(icon);
this->setWindowIcon(icon);
......
QMenu *menu = new QMenu(this);
QAction *action_exit = new QAction("退出",this);
//菜单项被触发信号槽
connect(action_exit,&QAction::triggered,this,&Widget::onActionExit);
menu->addAction(action_exit);
tray->setContextMenu(menu);
//托盘激活信号槽
connect(tray,&QSystemTrayIcon::activated,this,&Widget::onTrayActived);
}
void Widget::onActionExit(bool /*checked*/)
{
onCloseExit = true;
close();
}
//自定义QWidget 使用样式表,需要重写paintEvent
void Widget::paintEvent(QPaintEvent */*event*/)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void Widget::onTrayActived(QSystemTrayIcon::ActivationReason reason)
{
if(reason == QSystemTrayIcon::DoubleClick){
if(isVisible() && isMinimized()){
setWindowState(windowState()^ Qt::WindowMinimized);
show();
return;
}
if(isHidden()){
show();
}else{
hide();
}
}
}
2、exe带图标
2.1、qt项目文件
#exe程序带图标,需要提供资源文件*.rc
RC_FILE += app.rc
2.2、RC文件内容app.rc
IDI_ICON1 ICON DISCARDABLE "favicon.ico"
3、Qt5 exe带图标
今天看到了 Qt5设置应用程序图标和发布程序 博客的文章,了解另外一种更加快捷的方法
在.pro项目文件中添加一行代码:RC_ICONS = myico.ico //这里myico.ico就是图标文件的名字
不过必须是ico文件,png格式不行。
用QWidget::grab()抓一块区域,再用QPixmap.save()方法生成ico文件
# QPixmap QWidget::grab(const QRect &rectangle = QRect(QPoint(0, 0), QSize(-1, -1)))
QPixmap pic = grab(geometry());
//pic.save("timetable.png");
// pic.save("timetable.jpg");
pic.save("timetable.ico");