Qt-程序发布总结

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

猜你喜欢

转载自blog.csdn.net/weixin_40011280/article/details/128835767