Qt6 程序開機自啟找不到配置文件及外部程序

      網友投稿 763 2025-03-31

      歡迎來到我的博客,希望這篇文章對你有所幫助,如果覺得不錯,請搜藏哈。

      1. 場景描述

      還是用開機助手這個軟件來舉例,軟件在編譯打包完成后,正常啟動后,可以正常讀取到與其同級目錄下BAT文件中的關機腳本的,如下圖

      經過測試,是沒有問題,但是呢,當我們把程序設置為開機啟動,在程序開機自啟動后,無法讀取程序的關機腳本。

      2. 查找原因

      2.1 權限原因

      在開始部署的時候,把程序安裝到了C盤,開始懷疑是不是因為給的權利不夠,在給了全部權限后,還是不可以。排除權限問題。

      2.2 在部署目錄運行

      在部署目錄手動啟動,程序可以正常執行,可以讀取到關機腳本。

      2.3 文件路徑問題

      經過百度后,才明白,如果我們把程序設置為開機啟動后,因為開機啟動的指令其實也是CMD的指令,所以,如果我們在代碼中使用以下代碼獲取程序路徑,其實獲取到的是CMD程序的運行路徑,也就是“C:\Windows\System32”,所以會發現找不到文件

      Qt6 程序開機自啟找不到配置文件及外部程序

      QString appPath = QApplication::applicationFilePath();

      1

      3. 解決方法

      解決方案也很簡單,就是把獲取程序路徑的代碼修改一下,如下:

      QString curPath = QCoreApplication::applicationDirPath();

      1

      問題解決

      附上源碼

      #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setWindowTitle("網絡關機助手"); this->setWindowFlag(Qt::FramelessWindowHint); ui->label_mainBack->setStyleSheet("QLabel{border-image:url(:/images/images/mainBack.png);}"); ui->label_logo->setStyleSheet("QLabel{border-image:url(:/images/images/logo_W.png);}"); ui->pushButton_poweroff->setToolTip("關閉所有在線計算機"); ui->pushButton_close->setToolTip("最小化到任務欄"); ui->pushButton_poweroff->setStyleSheet("QPushButton{border-image:url(:/images/images/pw_n.png);}QPushButton:hover{border-image:url(:/images/images/pw_h.png);}QPushButton:pressed{border-image:url(:/images/images/pw_p.png);}"); ui->label_title->setText("網絡關機助手"); readConfig(); initUDPSocket(); initMySystemTrayIcon(); initGetTimeTimer(); getSystemInfor(); } MainWindow::~MainWindow() { if(m_getTimeTimer) { m_getTimeTimer->stop(); delete m_getTimeTimer; m_getTimeTimer = nullptr; } delete ui; } void MainWindow::powerOffBat() { QString strinfo; QProcess p(NULL); QString curPath = QCoreApplication::applicationDirPath(); QString toolPath; toolPath = "/BAT"; curPath.append(toolPath); p.setWorkingDirectory(curPath); toolPath = "/poweroff.bat"; curPath.append(toolPath); p.start(curPath); if(p.waitForFinished()) { qDebug() << "成功"; } else { QMessageBox::warning(this,"警告","執行關機腳本失敗\r\n請檢查程序根目錄下BAT文件中是否存在‘poweroff.bat’"); } } void MainWindow::sentConmad() { m_Socket->writeDatagram(QString::number(1,16).toLatin1(),QHostAddress::Broadcast,8088); } void MainWindow::on_pushButton_poweroff_clicked() { /* * 關機指令需要測試,UDP廣播應該是自己也可以收到,所以這里應該不需要單獨執行關機指令 */ sentConmad(); } void MainWindow::getUDPDate() { while (m_Socket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(m_Socket->pendingDatagramSize()); m_Socket->readDatagram(datagram.data(),datagram.size()); if(datagram.toInt() == 0x01) { if(this->isHidden()) { this->show(); } powerOffBat(); } } } void MainWindow::on_pushButton_close_clicked() { // this->close(); //最后注釋 this->hide(); } void MainWindow::initMySystemTrayIcon() { /* * 設置系統托盤內容 */ m_trayIcon = new QSystemTrayIcon(this); m_trayIcon->setIcon(QIcon(":/images/images/logo.ico")); m_trayIcon->setToolTip("關機助手"); m_trayIcon->show(); connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){ switch (temp) { case QSystemTrayIcon::Trigger: { //單擊圖標時間 break; } case QSystemTrayIcon::DoubleClick: { if(this->isHidden()) { this->showNormal(); } else { this->hide(); } break; } } }); initMySystemTrayIconAction(); initMySystemTrayIconMenu(); // m_trayIcon->showMessage("Tip","PowerControl is running",QSystemTrayIcon::MessageIcon::Information,3); } void MainWindow::initMySystemTrayIconAction() { m_showWindowAction = new QAction(QIcon(":/images/images/logo.ico"),"顯示界面",this); connect(m_showWindowAction,&QAction::triggered,this,[=](){this->show();}); m_exitAppAction = new QAction(QIcon(":/images/images/exit.ico"),"退出程序",this); connect(m_exitAppAction,&QAction::triggered,this,[=](){this->close();}); m_powerOffAppAction = new QAction(QIcon(":/images/images/logo.ico"),"一鍵關機",this); connect(m_powerOffAppAction,&QAction::triggered,this,&MainWindow::on_pushButton_poweroff_clicked); } void MainWindow::initMySystemTrayIconMenu() { m_trayIconMenu = new QMenu(this); m_trayIconMenu->addAction(m_powerOffAppAction); m_trayIconMenu->addSeparator(); m_trayIconMenu->addAction(m_showWindowAction); m_trayIconMenu->addAction(m_exitAppAction); m_trayIcon->setContextMenu(m_trayIconMenu); } void MainWindow::initUDPSocket() { m_Socket = new QUdpSocket(); m_Socket->bind(8088,QUdpSocket::ShareAddress); connect(m_Socket,&QUdpSocket::readyRead,this,&MainWindow::getUDPDate); } static QPoint last(0,0); //保存坐標 const int TITLE_HEIGHT = 50; //這里也可以使用宏定義,保存標題高度,也就是鼠標點擊區域的高度 void MainWindow::mousePressEvent(QMouseEvent *event) { if(event->position().y()globalPosition().toPoint(); } } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if(event->position().y()globalPosition().x() - last.x(); int dy = event->globalPosition().y() - last.y(); last = event->globalPosition().toPoint(); this->move(this->x()+dx,this->y()+dy); } } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { if(event->position().y()globalPosition().x() - last.x(); int dy = event->globalPosition().y() - last.y(); this->move(this->x()+dx,this->y()+dy); } } QString MainWindow::getTime(QString format) { QTime mTime = QTime::currentTime(); if(ui->checkBox_isTimerOff->isChecked()) if(mTime.hour() == mTimeOff.hour() && mTime.minute() == mTimeOff.minute()) { ui->checkBox_isTimerOff->setChecked(false); QSettings *config = new QSettings("CONFIG.ini",QSettings::IniFormat); config->setValue("TimerOff/HH",mTime.hour()); config->setValue("TimerOff/MM",mTime.minute()); sentConmad(); } return mTime.toString(format); } void MainWindow::initGetTimeTimer() { if(!m_getTimeTimer) { m_getTimeTimer = new QTimer(this); } connect(m_getTimeTimer,&QTimer::timeout,this,[=](){ ui->pushButton_close->setText(getTime("hh:mm")); }); m_getTimeTimer->start(500); } void MainWindow::getSystemInfor() { m_systemName = QHostInfo::localHostName(); QList ipAddressesList = QNetworkInterface::allAddresses(); for (int i = 0; i < ipAddressesList.size(); ++i) { if (ipAddressesList.at(i) != QHostAddress::LocalHost && ipAddressesList.at(i).toIPv4Address()) { m_systemIp = ipAddressesList.at(i).toString(); break; } } if (m_systemIp.isEmpty()) m_systemIp = QHostAddress(QHostAddress::LocalHost).toString(); ui->label_sysInfor->setText(QString("設備名稱:%1\r\nI P 地址:%2").arg(m_systemName).arg(m_systemIp)); } void MainWindow::readConfig() { QString curPath = QCoreApplication::applicationDirPath(); curPath.append("/CONFIG.ini"); QSettings *config = new QSettings(curPath,QSettings::IniFormat); ui->timeEdit_off->setTime(QTime(config->value("TimerOff/HH").toInt(),config->value("TimerOff/MM").toInt(),0,0)); if(config->value("TimerOff/FLAG").toInt()) { ui->checkBox_isTimerOff->setChecked(true); } } void MainWindow::on_timeEdit_off_userTimeChanged(const QTime &time) { mTimeOff = time; } void MainWindow::on_checkBox_isTimerOff_clicked(bool checked) { QString curPath = QCoreApplication::applicationDirPath(); curPath.append("/CONFIG.ini"); QSettings *config = new QSettings(curPath,QSettings::IniFormat); if(checked) { config->setValue("TimerOff/FLAG",1); config->setValue("TimerOff/HH",ui->timeEdit_off->time().hour()); config->setValue("TimerOff/MM",ui->timeEdit_off->time().minute()); } else config->setValue("TimerOff/FLAG",0); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      86

      87

      88

      89

      90

      91

      92

      93

      94

      95

      96

      97

      98

      99

      100

      101

      102

      103

      104

      105

      106

      107

      108

      109

      110

      111

      112

      113

      114

      115

      116

      117

      118

      119

      120

      121

      122

      123

      124

      125

      126

      127

      128

      129

      130

      131

      132

      133

      134

      135

      136

      137

      138

      139

      140

      141

      142

      143

      144

      145

      146

      147

      148

      149

      150

      151

      152

      153

      154

      155

      156

      157

      158

      159

      160

      161

      162

      163

      164

      165

      166

      167

      168

      169

      170

      171

      172

      173

      174

      175

      176

      177

      178

      179

      180

      181

      182

      183

      184

      185

      186

      187

      188

      189

      190

      191

      192

      193

      194

      195

      196

      197

      198

      199

      200

      201

      202

      203

      204

      205

      206

      207

      208

      209

      210

      211

      212

      213

      214

      215

      216

      217

      218

      219

      220

      221

      222

      223

      224

      225

      226

      227

      228

      229

      230

      231

      232

      233

      234

      235

      236

      237

      238

      239

      240

      241

      242

      243

      244

      245

      246

      247

      248

      249

      250

      251

      252

      253

      254

      255

      256

      257

      258

      259

      260

      261

      262

      4. 總結

      遇到問題不要慌,百度找找看,不行換Google。是在不行就甩鍋給系統,又可以水一天。

      Qt

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel計算差值的函數使用方法
      下一篇:批量修改Excel表格中批注的方法(excel批量修改批注內容)
      相關文章
      亚洲色大成网站www久久九| 亚洲欧洲综合在线| 亚洲综合无码无在线观看| 亚洲乱码在线视频| 亚洲欧洲中文日产| 亚洲春色另类小说| 亚洲女人初试黑人巨高清| 亚洲成人动漫在线观看| 亚洲免费中文字幕| 亚洲欧洲另类春色校园网站| 亚洲一级毛片在线播放| 亚洲人成网站18禁止久久影院| 亚洲欧洲日产韩国在线| 亚洲免费电影网站| 亚洲AV无码成人专区| 亚洲 日韩经典 中文字幕| 亚洲一本到无码av中文字幕| jiz zz在亚洲| 亚洲爆乳少妇无码激情| 亚洲av片在线观看| 午夜在线亚洲男人午在线| 成人亚洲综合天堂| 4338×亚洲全国最大色成网站| 国产精品V亚洲精品V日韩精品| 国产亚洲精品无码拍拍拍色欲| 亚洲中文字幕无码久久精品1 | 亚洲毛片av日韩av无码| 国产啪亚洲国产精品无码 | 久久精品国产亚洲Aⅴ香蕉 | 亚洲人成在线播放网站| 亚洲精品亚洲人成在线观看| 国产成人精品日本亚洲网站 | 亚洲 欧洲 日韩 综合在线| 亚洲熟妇无码一区二区三区导航| 亚洲愉拍一区二区三区| mm1313亚洲国产精品无码试看| 国产国拍亚洲精品福利| 久久精品国产亚洲AV网站| 亚洲网站免费观看| 国产成人精品亚洲日本在线| 含羞草国产亚洲精品岁国产精品|