mainwindow.cpp:523:37: error: incomplete type ‘QUrl’ used in nested name specifier
QDesktopServices::openUrl(QUrl::fromLocalFile("/home/主目录/文档"));
代码:
void MainWindow::on_pushButton_2_clicked()
{
QDesktopServices::openUrl(QUrl::fromLocalFile("/home/主目录/文档"));
}
C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "thread.h"
#include "worker.h"
#include "dialog.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <dirent.h>
#include <fcntl.h>
//#include <pthread.h>
#include <sys/types.h>
#include <QFileInfo>
#include <QFileDialog>
#include <QDesktopServices>
#include <qtimer.h>
#include <qthread.h>
#define N 256
QString s = "";
QString File_Name = "";
typedef struct sockaddr SA;
void begin();
void register0(int, char *);
void login0(int, char *);
void commd_ls(int, char *);
void commd_get(int, char *);
void commd_put(int, char *);
void * threadx (void *s);
void * threadx2 (void *ss);
void * threadx3 (void *ss);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->pushButton_5->setVisible(false);
}
MainWindow::~MainWindow()
{
delete ui;
}
struct member
{
int num;
struct sockaddr_in cli_addr;
socklen_t cli_len = 222;
int ser_sockfd;
};
void MainWindow::on_pushButton_clicked()
{
exit(0);
}
void begin()
{
int ser_sockfd, cli_sockfd;
struct sockaddr_in ser_addr, cli_addr;
int ser_len;
socklen_t cli_len = 222;
char commd [N];
bzero(commd, N); //将commd所指向的字符串的前N个字节置为0,包括'\0'
if((ser_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
{
printf("Sokcet Error!\n");
exit(1);
}
bzero(&ser_addr, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);//在TCP连接中,此处类似于自动获取ip地址
//在绑定ip时,自动选择ip地址
ser_addr.sin_port = htons ( 8989 );
//ser_len = sizeof(ser_addr);
ser_len = 111;
//将ip地址与套接字绑定
if((bind(ser_sockfd, (SA *)&ser_addr, ser_len)) < 0)
{
printf("Bind Error!\n");
exit(1);
}
//服务器端监听
if(listen(ser_sockfd, 5) < 0)
{
printf("Linsten Error!\n");
exit(1);
}
bzero(&cli_addr, sizeof(cli_addr));
ser_len = sizeof(cli_addr);
pthread_t thid2;
if(pthread_create(&thid2, NULL, threadx2, NULL) == -1)
{
printf("thread creation failed\n");
exit(1);
}
//exit(1);
while(1)
{
printf("server_ftp>");
//服务器端接受来自客户端的连接,返回一个套接字,此套接字为新建的一个,并将客户端的地址等信息存入cli_addr中
//原来的套接字仍处于监听中
if((cli_sockfd = accept(ser_sockfd, (SA *)&cli_addr, &cli_len)) < 0)
{
printf("Accept Error!\n");
exit(1);
}
else
{
//ui->textEdit->append("客户端的IP地址:");
//ui->textEdit->append(inet_ntoa(cli_addr.sin_addr));
struct member *b;
b = (struct member *)malloc(sizeof(struct member));
b->num = cli_sockfd;
b->cli_addr = cli_addr;
b->cli_len = cli_len;
b->ser_sockfd = ser_sockfd;
pthread_t thid;
printf("main thread ,ID is %d\n", pthread_self());
if(pthread_create(&thid, NULL, threadx, (void*)b) == -1)
{
printf("thread creation failed\n");
exit(1);
}
}
}
}
void commd_ls(int sockfd, char *filename)
{
DIR * mydir = NULL;
struct dirent *myitem = NULL;
char commd[N] ;
bzero(commd, N);
//opendir为目录操作函数,类似于open函数
//mydir中存有相关目录的信息(有待学习)
QString s2 = "/home/ubuntu-user-mc/source/" + s + "/" + filename;
QByteArray ba = s2.toLatin1();
if((mydir = opendir(ba.data())) == NULL)
{
printf("OpenDir Error!\n");
exit(1);
}
while((myitem = readdir(mydir)) != NULL)
{
bzero(commd, N);
if(sprintf(commd, myitem->d_name, N) < 0)
{
printf("Sprintf Error!\n");
exit(1);
}
int i = 0;
unsigned char isFile = 0x8;
if(myitem->d_type != isFile)
{
while(commd[i] != '\0')
{
i++;
}
commd[255] = '*';
}
if(write(sockfd, commd, N) < 0 )
{
printf("Write Error!\n");
exit(1);
}
}
s = s + "/" + filename;
closedir(mydir);
close(sockfd);
return ;
}
void commd_get(int sockfd, char *filename)
{
int fd, nbytes;
char buffer[N];
bzero(buffer, N);
printf("get filename : [ %s ]\n", filename);
QString s2 = "/home/ubuntu-user-mc/source/" + s + "/" + filename;
QByteArray ba = s2.toLatin1();
if((fd = open(s2.toStdString().data(), O_RDONLY)) < 0)
{
printf("Open file Error!\n");
buffer[0] = 'N';
if(write(sockfd, buffer, N) < 0)
{
printf("Write Error!At commd_get 1\n");
exit(1);
}
return ;
}
struct stat statbuff;
stat(s2.toStdString().data(), &statbuff);
//buffer[0] = 'Y'; //此处标示出文件读取成功
sprintf(buffer, "%d.bmp", statbuff.st_size / 512 + 1);
if(write(sockfd, buffer, N) < 0)
{
printf("Write Error! At commd_get 2!\n");
close(fd);
exit(1);
}
while((nbytes = read(fd, buffer, N)) > 0)
{
if(write(sockfd, buffer, nbytes) < 0)
{
printf("Write Error! At commd_get 3!\n");
printf("%s\n", ba.data());
close(fd);
exit(1);
}
}
close(fd);
close(sockfd);
return ;
}
void register0(int sockfd, char *filename)
{
QString s3 = "";
QString s2 = s3 + "" + filename;
QStringList sections = s2.split(" ");
QString name = sections.at(0).trimmed();
QString pwd = sections.at(1).trimmed();
int n = 0;
bool b = true;
FILE *fpRead = fopen("/home/ubuntu-user-mc/usrpw/usr_data.txt", "r");
if(fpRead == NULL)
b = true;
else
fscanf(fpRead, "%d", &n);
QString names[n];
QString pwds[n];
char names0[n][256];
char pwds0[n][256];
for(int i = 0; i < n; i++)
{
fscanf(fpRead, "%s", names0[i]);
if(QString(QLatin1String(names0[i])) == name)
b = false;
fscanf(fpRead, "%s", pwds0[i]);
}
fclose(fpRead);
char buffer[N];
bzero(buffer, N);
if(b)
buffer[0] = 'Y';
else
buffer[0] = 'N';
if(write(sockfd, buffer, N) < 0)
{
printf("Write Error! At commd_get 2!\n");
exit(1);
}
close(sockfd);
if(b)
{
FILE *fpWrite = fopen("/home/ubuntu-user-mc/usrpw/usr_data.txt", "w+");
fprintf(fpWrite, "%d\n", n + 1);
for(int i = 0; i < n; i++)
{
fprintf(fpWrite, "%s ", names0[i]);
fprintf(fpWrite, "%s\n", pwds0[i]);
}
QByteArray ba = name.toLatin1();
fprintf(fpWrite, "%s ", ba.data());
ba = pwd.toLatin1();
fprintf(fpWrite, "%s\n", ba.data());
fclose(fpWrite);
}
}
void login0(int sockfd, char *filename)
{
QString s3 = "";
QString s2 = s3 + "" + filename;
QStringList sections = s2.split(" ");
QString name = sections.at(0).trimmed();
QString pwd = sections.at(1).trimmed();
int n = 0;
bool b = false;
FILE *fpRead = fopen("/home/ubuntu-user-mc/usrpw/usr_data.txt", "r");
if(fpRead == NULL)
b = false;
else
fscanf(fpRead, "%d", &n);
QString names[n];
QString pwds[n];
char names0[n][256];
char pwds0[n][256];
for(int i = 0; i < n; i++)
{
fscanf(fpRead, "%s", names0[i]);
fscanf(fpRead, "%s", pwds0[i]);
if(QString(QLatin1String(names0[i])) == name)
if(QString(QLatin1String(pwds0[i])) == pwd)
b = true;
}
fclose(fpRead);
char buffer[N];
bzero(buffer, N);
if(b)
buffer[0] = 'Y';
else
buffer[0] = 'N';
if(write(sockfd, buffer, N) < 0)
{
printf("Write Error! At commd_get 2!\n");
exit(1);
}
close(sockfd);
}
void commd_put(int sockfd, char *filename)
{
int fd, nbytes;
char buffer[N];
bzero(buffer, N);
printf("get filename : [ %s ]\n", filename);
s = "";
QString s2 = "/home/ubuntu-user-mc/source/" + s + filename;
QByteArray ba = s2.toLatin1();
if((fd = open(s2.toStdString().data(), O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0)
{
printf("Open file Error!\n");
return ;
}
while((nbytes = read(sockfd, buffer, N)) > 0)
{
if(write(fd, buffer, nbytes) < 0)
{
printf("Write Error! At commd_put 1!\n");
close(fd);
exit(1);
}
}
close(fd);
close(sockfd);
return ;
}
void * threadx (void *ss)
{
struct member *temp;
temp = (struct member *)ss;
int num;
struct sockaddr_in cli_addr = temp->cli_addr;
socklen_t cli_len = temp->cli_len;
int cli_sockfd = temp->num;
int ser_sockfd = temp->ser_sockfd;
pthread_t newthid;
char commd[N] ;
newthid = pthread_self();
while(1)
{
if(read(cli_sockfd, commd, N) < 0) //read函数从cli_sockfd中读取N个字节数据放入commd中
{
printf("Read Error!\n");
exit(1);
}
printf("recvd [ %s ]\n", commd);
if(strncmp(commd, "zhugeliang", 10) == 0)
{
printf("用户登陆成功!\n");
exit(1);
}
if(strncmp(commd, "ls", 2) == 0)
{
if(commd[2] == '*')
s = "";
commd_ls(cli_sockfd, commd + 3);
}
else if(strncmp(commd, "get", 3) == 0 )
{
commd_get(cli_sockfd, commd + 4);
}
else if(strncmp(commd, "put", 3) == 0)
{
commd_put(cli_sockfd, commd + 4);
}
else if(strncmp(commd, "register", 8) == 0)
{
register0(cli_sockfd, commd + 9);
}
else if(strncmp(commd, "login", 5) == 0)
{
login0(cli_sockfd, commd + 6);
}
else
{
printf("Error!Command Error!\n");
}
if((cli_sockfd = accept(ser_sockfd, (SA *)&cli_addr, &cli_len)) < 0)
{
printf("Accept Error!\n");
exit(1);
}
}
printf("this is a new thread, thread ID = %d\n", newthid);
return NULL;
}
void * threadx2 (void *ss)
{
int ser_sockfd, cli_sockfd;
struct sockaddr_in ser_addr, cli_addr;
int ser_len;
socklen_t cli_len = 222;
char commd [N];
bzero(commd, N); //将commd所指向的字符串的前N个字节置为0,包括'\0'
if((ser_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
{
printf("Sokcet Error!\n");
exit(1);
}
bzero(&ser_addr, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);//在TCP连接中,此处类似于自动获取ip地址
//在绑定ip时,自动选择ip地址
ser_addr.sin_port = htons ( 8988 );
//ser_len = sizeof(ser_addr);
ser_len = 111;
//将ip地址与套接字绑定
if((bind(ser_sockfd, (SA *)&ser_addr, ser_len)) < 0)
{
printf("Bind Error!\n");
exit(1);
}
//服务器端监听
if(listen(ser_sockfd, 5) < 0)
{
printf("Linsten Error!\n");
exit(1);
}
bzero(&cli_addr, sizeof(cli_addr));
ser_len = sizeof(cli_addr);
if((cli_sockfd = accept(ser_sockfd, (SA *)&cli_addr, &cli_len)) < 0)
{
printf("Accept Error!\n");
exit(1);
}
while(1)
{
if(read(cli_sockfd, commd, N) < 0) //read函数从cli_sockfd中读取N个字节数据放入commd中
{
printf("Read Error!\n");
exit(1);
}
printf("recvd [ %s ]\n", commd);
if(strncmp(commd, "zhugeliang", 10) == 0)
{
printf("用户登陆成功!\n");
exit(1);
}
if(strncmp(commd, "ls", 2) == 0)
{
printf("ls Error!\n");
exit(1);
}
else if(strncmp(commd, "get", 3) == 0 )
{
printf("get Error!\n");
exit(1);
}
else if(strncmp(commd, "put", 3) == 0)
{
commd_put(cli_sockfd, commd + 4);
}
else
{
printf("Error!Command Error!\n");
}
if((cli_sockfd = accept(ser_sockfd, (SA *)&cli_addr, &cli_len)) < 0)
{
printf("Accept Error!\n");
exit(1);
}
}
return NULL;
}
void * threadx3 (void *ss)
{
Dialog *dialog = new Dialog();
dialog->show();
return NULL;
}
void MainWindow::on_pushButton_2_clicked()
{
QDesktopServices::openUrl(QUrl::fromLocalFile("/home/主目录/文档"));
}
void MainWindow::on_pushButton_3_clicked()
{
ui->textEdit->append("服务器开启");
QCoreApplication::processEvents();
Thread *m_pWorkerThread = new Thread;
m_pWorkerThread->start();
connect(m_pWorkerThread, SIGNAL(sendData(QString)), this, SLOT(receiveData(QString)));
//connect(m_pWorkerThread, SIGNAL(sendData2(QString)), this, SLOT(receiveData2(QString)));
//connect(m_pWorkerThread, SIGNAL(finished()), m_pWorker, SLOT(deleteLater()));
}
QString name;
void MainWindow::receiveData(QString data)
{
name = data;
if(name == "exit")
ui->textEdit->append("用户:" + name + "退出");
else
ui->textEdit->append("用户:" + data + "登录");
}
void MainWindow::receiveData2(QString data)
{
}
void MainWindow::on_pushButton_4_clicked()
{
ui->listWidget->clear();
int n = 0;
FILE *fpRead = fopen("usr/usr_data.txt", "r");
fscanf(fpRead, "%d", &n);
char names0[n][256];
char pwds0[n][256];
for(int i = 0; i < n; i++)
{
fscanf(fpRead, "%s", names0[i]);
ui->listWidget->addItem(new QListWidgetItem(QIcon("/home/主目录/文档/z1/yh2.png"), tr(names0[i])));
fscanf(fpRead, "%s", pwds0[i]);
}
fclose(fpRead);
}
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
File_Name = item->text();
ui->pushButton_5->setVisible(true);
}
void MainWindow::on_pushButton_5_clicked()
{
ui->listWidget->clear();
int n = 0;
FILE *fpRead = fopen("/usr/usr_data.txt", "r");
fscanf(fpRead, "%d", &n);
char names0[n][256];
char pwds0[n][256];
for(int i = 0; i < n; i++)
{
fscanf(fpRead, "%s", names0[i]);
fscanf(fpRead, "%s", pwds0[i]);
}
fclose(fpRead);
FILE *fpWrite = fopen("/usr/usr_data.txt", "w+");
fprintf(fpWrite, "%d\n", n - 1);
for(int i = 0; i < n; i++)
{
if(names0[i] != File_Name)
{
fprintf(fpWrite, "%s ", names0[i]);
fprintf(fpWrite, "%s\n", pwds0[i]);
}
}
fclose(fpWrite);
FILE *fpRead2 = fopen("/usr/usr_data.txt", "r");
fscanf(fpRead2, "%d", &n);
for(int i = 0; i < n; i++)
{
fscanf(fpRead2, "%s", names0[i]);
ui->listWidget->addItem(new QListWidgetItem(QIcon("/home/主目录/文档/z1/yh2.png"), tr(names0[i])));
fscanf(fpRead2, "%s", pwds0[i]);
}
fclose(fpRead2);
ui->pushButton_5->setVisible(false);
}
void MainWindow::on_listWidget_clicked(const QModelIndex &index){}
void MainWindow::on_pushButton__clicked(){}
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y