此代码只能在开发板上使用
pro文件
头文件
需要用到的头文件
#include
#include
#include
#include
#include
头文件里的成员函数和变量
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget parent = nullptr);
~Widget();
int System_Check(int result);
void initWifi();
void refrushWifi();
QString executeLinuxCmd(QString strCmd);
void openWifi();
void writeConfFile();
void writeShellFile();
void wifiPasswordInterface();
void destroyMainLayoutWidget(QLayout layout);
private slots:
void selectCurrentWifi();
private:
Ui::Widget *ui;
QString transfer;
QString temp[10];//信号强度
QString wifiName[10];//wifi名称
QString flagWN[10];
QString flagT[10];
QRadioButton *radioBtn[10];
QString strShellPath;
bool isOpenWifi=false;
QWidget *WidgetWifiNameAndPassword;
QPushButton btnAddOk;
QPushButton btnAddCancel;
QLabel labelWifiPassword;
QLineEdit lineEditWifiPassword;
QString strWifiName;
};
CPP文件
#include “widget.h”
#include “ui_widget.h”
#include
#include
#include
#include
#include
#include
#include
#include <QtNetwork/QNetworkInterface>
#include <QtNetwork/QNetworkConfigurationManager>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
initWifi();
wifiPasswordInterface();
//显示当前IP
QNetworkConfigurationManager m;
if (!m.isOnline()){
ui->labelCurrentIP->setText("当前IP:未联网");
}else {
ui->labelCurrentIP->setText("当前IP:"+QNetworkInterface::allAddresses().at(2).toString());
}
//刷新wifi列表
connect(ui->btnRefrush,&QPushButton::clicked,[=](){
if(!isOpenWifi){
refrushWifi();
}else {
QMessageBox::warning(this,"warning","请先断开当前wifi");
}
});
connect(&btnAddCancel,&QPushButton::clicked,[=](){
WidgetWifiNameAndPassword->hide();
});
connect(&btnAddOk,&QPushButton::clicked,[=](){
if(!isOpenWifi){
btnAddOk.setText("连接中...");
openWifi();
}else {
QMessageBox::warning(this,"warning","请先断开当前wifi");
}
isOpenWifi = true;
WidgetWifiNameAndPassword->hide();
});
connect(ui->btnConnectWifi,&QPushButton::clicked,[=](){
selectCurrentWifi();
});
connect(ui->btnDisconnectWifi,&QPushButton::clicked,[=](){
if(isOpenWifi){
int result =0;
result = system("ifconfig wlan0 down");
if(!System_Check(result)){
QMessageBox::warning(this,"提示","WIFI关闭成功");
QNetworkConfigurationManager m;
if (!m.isOnline())
{
ui->labelCurrentIP->setText("当前IP:未联网");
}else {
ui->labelCurrentIP->setText("当前IP:"+QNetworkInterface::allAddresses().at(2).toString());
}
isOpenWifi = false;
}
else
QMessageBox::warning(this,"提示","WIFI关闭失败");
}else {
QMessageBox::warning(this,"warning","wifi还未开启");
}
});
}
/**
- @brief Widget::destroyMainLayoutWidget
- 销毁布局内的所有控件
- @param layout
/
void Widget::destroyMainLayoutWidget(QLayout layout){
QLayoutItem *child;
int num = layout->count();
if(num != 0){
while (!layout->isEmpty())
{
child = layout->takeAt(0);
if(child->widget())
{
child->widget()->setParent(nullptr);
}else if(child->layout()){
destroyMainLayoutWidget(child->layout());
}
delete child;
}
}
}
void Widget::initWifi()
{
int i =0;
int j =0;
int t =0;
system(“rm -r /temp”);
system(“rm -r /grepTemp”);
system(“ifconfig wlan0 up”);
int result =0;
result = system(“iwlist wlan0 scan >/temp”);
if(!System_Check(result)){
int result_1 =0;
result_1 = system(“grep -E ‘ESSID|Quality’ /temp >/grepTemp”);
if(!System_Check(result_1))
system(“grep -v “x00” /grepTemp >/temp”);
else{
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
}else {
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
QString fileName;
fileName = “/temp”;
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<“open failed”;
return;
}
QTextStream in(&file);
QString line = in.readLine();
while (i<10)
{
line = in.readLine();
qDebug() << “wifi_line:” << line;
for(t=27;t<line.size()-1;t++) //take off other words
{
wifiName[i] +=line[t];
}
line = in.readLine();
qDebug() << “temp_line:” << line;
for(t=28;t<30;t++) //take off other words
{
temp[i] +=line[t];
}
i++;
}
file.close();
for(i=0;i<9;i++){
for(j=1;j<10;j++){
if(temp[i]>temp[j]){
transfer = temp[i];
temp[i] = temp[j];
temp[j] = transfer;
transfer =wifiName[i];
wifiName[i] = wifiName[j];
wifiName[j] = transfer;
}
}
}
int m=0;
for(i=0;i<10;i++){
if(wifiName[i].isEmpty()){
wifiName[i].remove(i);
}else {
flagWN[m] = wifiName[i];
flagT[m] = temp[i];
m++;
}
}
i =0;
j =0;
int k=0;
//有多少个有名称的信号就添加几个按钮
while(i<m){
if(flagWN[j] == '\0')//wifiName[j]
{
// break;
k++;
if(k ==10)
{
qDebug()<<"false";
QMessageBox messageBox;
messageBox.setText(tr("无法搜索WLAN信号"));
messageBox.setIcon(QMessageBox::Warning);
messageBox.exec();
}
}
else if(!(flagWN[j] =='\0'))//wifiName[j]
{
radioBtn[i] = new QRadioButton;
radioBtn[i]->text().clear();
radioBtn[i]->setText(flagWN[j]);//wifiName[j]
radioBtn[i]->setStyleSheet("QRadioButton::indicator {"
"width:30px;"
"height:30px;}");
ui->gridLayout_3->addWidget(radioBtn[i]);
i++;
}
j++;
}
//给剩下的按钮分配空间,不然就会崩溃
for(int i=m;i<10;i++){
radioBtn[i] = new QRadioButton(this);
}
}
void Widget::refrushWifi()
{
int i =0;
int j =0;
int t =0;
for(int i=0;i<10;i++){
delete radioBtn[i];
wifiName[i].clear();
temp[i].clear();
transfer.clear();
flagWN[i].clear();
flagT[i].clear();
}
system(“rm -r /temp”);
system(“rm -r /grepTemp”);
system(“ifconfig wlan0 up”);
int result =0;
result = system(“iwlist wlan0 scan >/temp”);
if(!System_Check(result)){
int result_1 =0;
result_1 = system(“grep -E ‘ESSID|Quality’ /temp >/grepTemp”);
if(!System_Check(result_1))
system(“grep -v “x00” /grepTemp >/temp”);
else{
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
}else {
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
QString fileName;
fileName = “/temp”;
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<“open failed”;
return;
}
QTextStream in(&file);
QString line=in.readLine();
while (i<10)
{
line = in.readLine();
qDebug() << “wifi_line:” << line;
for(t=27;t<line.size()-1;t++) //take off other words
{
wifiName[i] +=line[t];
}
line = in.readLine();
qDebug() << “temp_line:” << line;
for(t=28;t<30;t++) //take off other words
{
temp[i] +=line[t];
}
i++;
}
line.clear();
file.close();
//按信号强弱排序wifi
for(i=0;i<9;i++)
{
for(j=1;j<10;j++)
{
if(temp[i]>temp[j])
{
transfer = temp[i];
temp[i] = temp[j];
temp[j] = transfer;
transfer =wifiName[i];
wifiName[i] = wifiName[j];
wifiName[j] = transfer;
}
}
}
int m=0;
//提取其中名称不为空的wifi
for(i=0;i<10;i++){
if(wifiName[i].isEmpty()){
wifiName[i].remove(i);
}else {
flagWN[m]=wifiName[i];
flagT[m] = temp[i];
m++;
}
}
i =0;
j =0;
int k=0;
while(i<m)
{
if(flagWN[j] == '\0') //wifiName[j]
{
// break;
k++;
if(k ==10)
{
qDebug()<<"false";
QMessageBox messageBox;
messageBox.setText(tr("无法搜索WLAN信号"));
messageBox.setIcon(QMessageBox::Warning);
messageBox.exec();
}
}
else if(!(flagWN[j] =='\0')) //wifiName[j]
{
radioBtn[i] = new QRadioButton(this);
radioBtn[i]->text().clear();
radioBtn[i]->setText(flagWN[j]);//wifiName[j]
radioBtn[i]->setStyleSheet("QRadioButton::indicator {"
"width:30px;"
"height:30px;}");
ui->gridLayout_3->addWidget(radioBtn[i],j,0);
i++;
}
j++;
}
for(int i=m;i<10;i++){
radioBtn[i] = new QRadioButton(this);
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::selectCurrentWifi()
{
lineEditWifiPassword.clear();
btnAddOk.setText(“确定”);
if(radioBtn[0]->isChecked()){
QString wifiName = radioBtn[0]->text();
//QString wifiConnect = tr("iwconfig wlan0 essid “%1” ").arg(wifiName);
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
//qDebug() << “strWifiName” << strWifiName;
}
if(radioBtn[1]->isChecked()){
QString wifiName = radioBtn[1]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[2]->isChecked()){
QString wifiName = radioBtn[2]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[3]->isChecked()){
QString wifiName = radioBtn[3]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[4]->isChecked()){
QString wifiName = radioBtn[4]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[5]->isChecked()){
QString wifiName = radioBtn[5]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[6]->isChecked()){
QString wifiName = radioBtn[6]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[7]->isChecked()){
QString wifiName = radioBtn[7]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[8]->isChecked()){
QString wifiName = radioBtn[8]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[9]->isChecked()){
QString wifiName = radioBtn[9]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
}
//执行shell指令或者shell脚本的方法
QString Widget::executeLinuxCmd(QString strCmd)
{
QProcess p;
p.start(“bash”, QStringList() <<"-c" << strCmd);
p.waitForFinished();
QString strResult = p.readAllStandardOutput();
return strResult;
}
/**
- @brief Widget::System_Check
- @param result 返回标志值
- @return
*/
int Widget::System_Check(int result)
{
if((-1 != result) && (WIFEXITED(result)) && (!(WEXITSTATUS(result))))
return 0;
else
return -1;
}
void Widget::openWifi()
{
writeConfFile();
writeShellFile();
ui->labelCurrentIP->clear();
int result =0;
result = system(“sh /startWifi.sh”);
if(!System_Check(result)){
QMessageBox::warning(this,“提示”,“WIFI打开成功”);
btnAddOk.setText(“连接成功”);
}
else
QMessageBox::warning(this,“提示”,“WIFI打开失败”);
//获取本地IP片地址,
QList addList = QNetworkInterface::allAddresses();
foreach(QHostAddress address,addList)
{
//排除IPV6,排除回环地址
if(address.protocol() == QAbstractSocket::IPv4Protocol
&& address != QHostAddress(QHostAddress::LocalHost))
{
//输出,转换为字符串格式
ui->labelCurrentIP->setText(“当前IP:”+address.toString());
}
}
}
void Widget::writeConfFile()
{
QString strCONFPath;
strCONFPath = “/etc/wifi-conf/WIFI.CONF”;
QFileInfo file(strCONFPath);
if(file.exists()==true)
{
system(“rm -r /etc/wifi-conf/WIFI.CONF”);
}
QFile f(strCONFPath);
if(!f.open(QIODevice::WriteOnly))
{
qDebug() << “Open failed.”;
return;
}
QTextStream txtOutput(&f);
txtOutput << "# reading passphrase from stdin" << endl
<< "network={" << endl
<< " ssid=\"" << strWifiName << "\"" << endl
<< " psk=\"" << lineEditWifiPassword.text() << "\"" << endl
<< "}";
f.close();
}
void Widget::writeShellFile()
{
system(“rm -r /startWifi.sh”);
strShellPath = “/startWifi.sh”;
QFile f(strShellPath);
if(!f.open(QIODevice::WriteOnly))
{
qDebug() << “Open failed.”;
return;
}
QTextStream txtOutput(&f);
txtOutput << “#!/bin/bash” << endl
<< “cd /etc/wifi-conf” << endl
<< “./ifup_wifi_sta”;
f.close();
system(“chmod 777 /startWifi.sh”);
}
void Widget::wifiPasswordInterface()
{
WidgetWifiNameAndPassword = new QWidget;
WidgetWifiNameAndPassword->setWindowFlags(WidgetWifiNameAndPassword->windowFlags() |Qt::Dialog);
WidgetWifiNameAndPassword->setWindowModality(Qt::ApplicationModal); //阻塞除当前窗体之外的所有的窗体
WidgetWifiNameAndPassword->setFixedSize(300,150);
WidgetWifiNameAndPassword->setGeometry(350,350,300,150);
WidgetWifiNameAndPassword->setWindowTitle(QObject::tr(“wifi密码”));
QFont ft;
ft.setPointSize(15);
labelWifiPassword.setFont(ft);
lineEditWifiPassword.setFont(ft);
btnAddOk.setFont(ft);
btnAddCancel.setFont(ft);
btnAddOk.setText(“确定”);
btnAddCancel.setText(“退出”);
btnAddOk.setFixedSize(QSize(140,45));
btnAddCancel.setFixedSize(QSize(140,45));
lineEditWifiPassword.setFixedSize(QSize(280,45));
labelWifiPassword.setText(“请输入WIFI密码”);
QGridLayout* layout = new QGridLayout(WidgetWifiNameAndPassword);
layout->addWidget(&labelWifiPassword,0,0,1,2);
layout->addWidget(&lineEditWifiPassword,1,0,1,2);
layout->addWidget(&btnAddOk,2,0,1,1);
layout->addWidget(&btnAddCancel,2,1,1,1);
}
ui文件