QT qmake 和cmake 添加exe图标
cmake :
手动创建一个xxx.rc文件,并输入
IDI_ICON1 ICON DISCARDABLE "sandglass.ico"
然后把rc的文件加入到cmakelist中
set(WIN_RC_FILE "xxx.rc")
set(PROJECT_SOURCES main.cpp ${WIN_RC_FILE})
qmake
…暂时省略
QT 窗口嵌入window桌面
准备函数
#include "windows.h"
#include <QWidget>
bool enumUserWindowsCB(HWND hwnd, LPARAM lParam)
{
long wflags = GetWindowLong(hwnd, GWL_STYLE);
if (!(wflags & WS_VISIBLE)) {
return TRUE;
};
HWND sndWnd;
if (!(sndWnd=FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL))) {
return TRUE;
}
HWND targetWnd;
if (!(targetWnd=FindWindowEx(sndWnd, NULL, L"SysListView32", L"FolderView"))) {
return TRUE;
}
HWND* resultHwnd = (HWND*)lParam;
*resultHwnd = targetWnd;
return FALSE;
}
void setParentDesktop(QWidget *pWidget)
{
HWND resultHwnd = NULL;
EnumWindows((WNDENUMPROC)enumUserWindowsCB, (LPARAM)&resultHwnd);
// 设置桌面为父窗口
if (resultHwnd) {
SetParent((HWND)pWidget->winId(), resultHwnd);
}
}
嵌入桌面
QWidget* widget = new QWidget();
setParentDesktop(widget);
widget.show();
QT 悬浮窗模式(窗口置顶)
Qt::WindowFlags m_flags = windowFlags();
setWindowFlags(m_flags | Qt::WindowStaysOnTopHint);
QT 托盘图标显示,任务栏不显示
托盘图标
//托盘图标、菜单
QSystemTrayIcon* qsys=new QSystemTrayIcon(this);
qsys->setIcon(QIcon(":/image/sandglass.ico"));
qsys->setToolTip(tr("倒计时"));
QMenu* menu = new QMenu(this);
QAction * actionWindow = new QAction("打开面板", this);
menu->addAction(actionWindow);
connect(actionWindow, &QAction::triggered, this, &ShandowWind::showNormal);//用要操作的窗口响应
QAction *actionClose = new QAction("退出",this);
menu->addAction(actionClose);
connect(actionClose,&QAction::triggered, this, &QApplication::exit); //肯定能退出
qsys->setContextMenu(menu);
qsys->show();
/响应图标点击事件,要自定义槽函数。
connect(qsys, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
任务栏不显示
//设置图标
setWindowIcon(QIcon(":/image/sandglass.ico"));
//去掉放大缩小, 去掉菜单栏目, 任务栏隐藏,
this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::Tool);
QT 程序配置windows注册表开机自启
准备函数
#include <QDir>
#include <QSettings>
void SetProcessAutoRunSelf(const QString &appPath, int flag)
{
//注册表路径需要使用双反斜杠,如果是32位系统,要使用QSettings::Registry32Format
QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::Registry64Format);
//以程序名称作为注册表中的键
//根据键获取对应的值(程序路径)
QFileInfo fInfo(appPath);
QString name = fInfo.baseName();
QString path = settings.value(name).toString();
//如果注册表中的路径和当前程序路径不一样,
//则表示没有设置自启动或自启动程序已经更换了路径
//toNativeSeparators的意思是将"/"替换为"\"
QString newPath = QDir::toNativeSeparators(appPath);
if(flag)
{
if (path != newPath)
settings.setValue(name, newPath);
}
else
{
settings.remove(name);
}
}
bool isAutoRun(const QString &appPath)
{
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QFileInfo fInfo(appPath);
QString name = fInfo.baseName();
QString oldPath = settings.value(name).toString();
QString newPath = QDir::toNativeSeparators(appPath);
return (settings.contains(name) && newPath == oldPath);
}
使用
if(arg1 == Qt::CheckState::Checked)
{//设置成开机自启动
SetProcessAutoRunSelf(qApp->applicationFilePath(), 1);
qDebug() << "Checked";
}
else if(arg1 == Qt::CheckState::Unchecked)
{//取消开机自启动
SetProcessAutoRunSelf(qApp->applicationFilePath(), 0);
qDebug() << "UnChecked";
}