Qt 在Windows下設置Wifi連接和有線連接


Wifi連接-自動獲取IP

實現程序如下:

// 設置網絡為DHCP
QProcess cmd;
cmd.start(QString("netsh interface ip set address \"%1\" dhcp").arg("WLAN"));
cmd.waitForStarted();
cmd.waitForFinished();
QString strCmdOut = QString::fromLocal8Bit(cmd.readAllStandardOutput());
// 有時候執行命令后等待時間太短,已連接wifi還沒來得及可以正常使用,則會返回"\r\n"
// 但實際已經成功啟用DHCP。(必須先連接wifi,才能正常啟用DHCP)
if (strCmdOut.contains("已在此接口上啟用 DHCP。") || strCmdOut == "\r\n")
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("自動獲取IP成功", SuccessIcon);
    pPromptBox->exec();
}
else
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("自動獲取IP失敗", FailIcon);
    pPromptBox->exec();
}

Wifi連接-手動獲取IP

實現程序如下:

// 1. 設置為靜態IP
QString strCommand("netsh interface ip set address");

// 2. 執行CMD命令
strCommand += QString("\"%1\" ").arg("WLAN");
strCommand += QString("static %1 ").arg(m_pEditIP->text());
strCommand += QString("%1 ").arg(m_pEditMask->text());
strCommand += QString("%1").arg(m_pEditGway->text());
QProcess cmd;
cmd.start(strCommand);
cmd.waitForStarted();
cmd.waitForFinished();
// cmd.readAllStandardError()這些信息只能輸出一次,所以要賦值給臨時QString
// 有線連接和wifi網卡的IP不能設置為一樣的,否則會提示:"對象已存在"
QString strCmdOut = QString::fromLocal8Bit(cmd.readAllStandardOutput());
QString strError = QString::fromLocal8Bit(cmd.readAllStandardError());
qDebug() << "設置為靜態IP_strCmdOut: " << strCmdOut;
qDebug() << "設置為靜態IP_error: " << strError;
// 判斷cmd是否執行成功
if (strCmdOut.contains("address"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效IP參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut.contains("mask"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效mask參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut.contains("gateway"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效gateway參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut == "\r\n" && strError == "")
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("手動設置成功", SuccessIcon);
    pPromptBox->exec();

    this->accept();
    emit NetConfigSuc(); // 發射網絡配置成功的信號
}
else if (strCmdOut.contains("對象已存在。"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("網絡配置未改動", SuccessIcon);
    pPromptBox->exec();

    this->accept();
    emit NetConfigSuc(); // 發射網絡配置成功的信號
}
else
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("手動設置失敗", FailIcon);
    pPromptBox->exec();
}

有線連接-自動獲取IP

實現程序如下:

// 設置網絡為DHCP
QProcess cmd;
cmd.start(QString("netsh interface ip set address \"%1\" dhcp").arg("以太網"));
cmd.waitForStarted();
cmd.waitForFinished();
QString strCmdOut = QString::fromLocal8Bit(cmd.readAllStandardOutput());
// 有時候執行命令后等待時間太短,已連接wifi還沒來得及可以正常使用,則會返回"\r\n"
// 但實際已經成功啟用DHCP。(必須先連接wifi,才能正常啟用DHCP)
if (strCmdOut.contains("已在此接口上啟用 DHCP。") || strCmdOut == "\r\n")
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("自動獲取IP成功", SuccessIcon);
    pPromptBox->exec();
}
else
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("自動獲取IP失敗", FailIcon);
    pPromptBox->exec();
}

有線連接-手動獲取IP

實現程序如下:

// 1. 設置為靜態IP
QString strCommand("netsh interface ip set address");

// 2. 執行CMD命令
strCommand += QString("\"%1\" ").arg("以太網");
strCommand += QString("static %1 ").arg(m_pEditIP->text());
strCommand += QString("%1 ").arg(m_pEditMask->text());
strCommand += QString("%1").arg(m_pEditGway->text());
QProcess cmd;
cmd.start(strCommand);
cmd.waitForStarted();
cmd.waitForFinished();
// cmd.readAllStandardError()這些信息只能輸出一次,所以要賦值給臨時QString
// 有線連接和wifi網卡的IP不能設置為一樣的,否則會提示:"對象已存在"
QString strCmdOut = QString::fromLocal8Bit(cmd.readAllStandardOutput());
QString strError = QString::fromLocal8Bit(cmd.readAllStandardError());
qDebug() << "設置為靜態IP_strCmdOut: " << strCmdOut;
qDebug() << "設置為靜態IP_error: " << strError;
// 判斷cmd是否執行成功
if (strCmdOut.contains("address"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效IP參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut.contains("mask"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效mask參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut.contains("gateway"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("無效gateway參數", PromptIcon);
    pPromptBox->exec();
}
else if (strCmdOut == "\r\n" && strError == "")
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("手動設置成功", SuccessIcon);
    pPromptBox->exec();

    this->accept();
    emit NetConfigSuc(); // 發射網絡配置成功的信號
}
else if (strCmdOut.contains("對象已存在。"))
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("網絡配置未改動", SuccessIcon);
    pPromptBox->exec();

    this->accept();
    emit NetConfigSuc(); // 發射網絡配置成功的信號
}
else
{
    MyPromptBox *pPromptBox = new MyPromptBox;
    pPromptBox->setLabInfo("手動設置失敗", FailIcon);
    pPromptBox->exec();
}

完整工程的GitHub鏈接

https://github.com/confidentFeng/VSAppProject/tree/NetControl



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM