qt的ftp系统qurl问题

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