报告peony使用中发现的bug

peony 使用问题记录及解决方案

在 peony 的使用中发现了许多问题,记录如下:

  1. 命令行模式无法访问未登录网络地址(已在下面解决,但总觉得非完美方式,临时先用着!希望OperEuler或UKUI官方能给出更好的的解决方案!)
  2. 从虚拟机粘贴文件时偶尔会出现 “不支持的操作” 错误(已在下面解决)
  3. 复制 linux 图标文件夹,会报各种错误,真是痛苦的体验(目前还不耽误一般使用,懒得管)

消除编译警告

我真不知道麒麟官方是想什么呢?是真不怕人笑话呀!编译个程序弄了 6913 处问题,看得我眼花缭乱,不得不先处理一下,不然调试报错都找不着在哪。

消除 ISO C++ forbids converting a string constant to ‘char*’警告

  • 将 libpeony-qt/file-info.h 文件中的

plaintext

static char *office_mime_types[] = {
......
};

[image]

这一整段注释掉,然后添加:

plaintext

extern const char *office_mime_types[];
  • 在 libpeony-qt/file-info.cpp 文件头部 using namespace Peony; 下方添加

plaintext

const char *Peony::office_mime_types[] = {
    "application/wps-office.doc",
    "application/msword",
    "application/vnd.ms-word",
    "application/x-msword",
    "application/vnd.ms-word.document.macroenabled.12",
    "application/wps-office.dot",
    "application/msword-template",
    "application/vnd.ms-word.template.macroenabled.12",
    "application/wps-office.dotx",
    "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
    "application/wps-office.docx",
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    "application/wps-office.wps",
    "application/vnd.ms-works",
    "application/wps-office.wpt",
    "application/wps-office.ppt",
    "application/vnd.ms-powerpoint",
    "application/powerpoint",
    "application/mspowerpoint",
    "application/x-mspowerpoint",
    "application/vnd.ms-powerpoint.presentation.macroenabled.12",
    "application/wps-office.pot",
    "application/vnd.ms-powerpoint.template.macroenabled.12",
    "application/wps-office.potx",
    "application/vnd.openxmlformats-officedocument.presentationml.template",
    "application/wps-office.pptx",
    "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
    "application/wps-office.dps",
    "application/wps-office.dpt",
    "application/wps-office.xls",
    "application/vnd.ms-excel",
    "application/msexcel",
    "application/x-msexcel",
    "application/vnd.ms-excel.sheet.macroenabled.12",
    "application/vnd.ms-excel.template.macroenabled.12",
    "application/wps-office.xlt",
    "application/wps-office.xltx",
    "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "application/wps-office.et",
    "application/wps-office.ett",
    "end"
};

修改前共有 6913 处问题,修改后问题数变为 1766,我不知道为什么要那样写?其它的不管了,也不知道对程序运行有没有影响。

改造 Peony 让它的命令行使用方式也能处理未登录的网路请求

具体步骤

  1. 在 main-window.h 中的 MainWindow 的类声明中加入以下内容:

plaintext

private:
    bool isFirstStartSmbUri = false;
    QString smbUrl = nullptr;
  1. 将 MainWindow::initUI 和 MainWindow::addNewTabs 方法按如下内容进行修改:
  • void MainWindow::initUI (const QString &uri) 方法中的:

plaintext

    m_tab = views;
    if (uri.isNull()) {
        auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
        m_tab->addPage(home, true);
    } else {
        if (isSmbUrl(uri)){
            auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
            m_tab->addPage(home, true);
            smbUrl = uri;
            isFirstStartSmbUri = true;
        } else
            m_tab->addPage(uri, true);
        m_header_bar->setLocation(uri);
  • bool isSmbUrl(const QString &url) {

plaintext

    return url.startsWith("smb://", Qt::CaseInsensitive);
    // 如果区分大小写,可以使用 Qt::CaseSensitive
  • void MainWindow::addNewTabs(const QStringList &uris)

plaintext

    //fix search path add new tab,page title show abnormal issue
    if (uris.count() == 1)
    {
        if (isSmbUrl(uris.first())){
            auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
            m_tab->addPage(home, true);
            smbUrl = uris.first();
            isFirstStartSmbUri = true;
        }else
            m_tab->addPage(uris.first(), true);
        return;
    }
    for (auto uri : uris) {
        if (isSmbUrl(uri)){
            auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
            m_tab->addPage(home, true);
            smbUrl = uri;
            isFirstStartSmbUri = true;
        }else
            m_tab->addPage(uri, false);
    }

说明:直接在这些位置调用 MainWindw::goToUri 方法,会因为主窗口还没有初始化,而发生访问空指针错误。正确的方法是先让它以一个文件目录完成初始化,然后再访问网络路径。

  1. 核心改造
    在 void MainWindow::paintEvent (QPaintEvent *e) 方法最后面加入以下内容:

plaintext

    QString CurrentUri = getCurrentUri();
    if(isFirstStartSmbUri){
        static int count = 0;
        if((!CurrentUri.isNull()) && (count == 0))
            count ++;
        else if(count == 8){
            goToUri(smbUrl);
            smbUrl = nullptr;
            isFirstStartSmbUri = false;
            count = 0;
        }
        else
            count ++;

测试

能看到登录界面了,输入用户名密码,能正常访问,说明改造成功。

修复从虚拟机粘贴文件时偶尔会出现 “不支持的操作” 错误问题

代码修改

将以下出错代码:

plaintext

    FileOperation *op = nullptr;
    if (!isClipboardHasFiles()) {
        return op;
    }
    //check existed
    auto uris = getClipboardFilesUris();
//    for (auto uri : getClipboardFilesUris()) {
//        //FIXME: replace BLOCKING api in ui thread.
//        if (!FileUtils::isFileExsit(uri)) {
//            uris.removeAll(uri);
//        }
//    }
    if (uris.isEmpty()) {
        return op;
    }
auto parentPath = FileUtils::getParentUri(uris.first());

修改为:

plaintext

FileOperation *op = nullptr;
    if (!isClipboardHasFiles()) {
        return op;
    }
    //check existed
    //    for (auto uri : getClipboardFilesUris()) {
//        //FIXME: replace BLOCKING api in ui thread.
//        if (!FileUtils::isFileExsit(uri)) {
//            uris.removeAll(uri);
//        }
//    }
    uris.erase(
        std::remove_if(uris.begin(), uris.end(),
                       [](const QString& uri) {
                           return !FileUtils::isFileExsit(uri);
                       }),
        uris.end()
    );
    if (uris.isEmpty()) {
        return op;
    }
auto parentPath = FileUtils::getParentUri(uris.first());

测试

粘贴出错文件,发现已能正常粘贴文件。