peony 使用问题记录及解决方案
在 peony 的使用中发现了许多问题,记录如下:
- 命令行模式无法访问未登录网络地址(已在下面解决,但总觉得非完美方式,临时先用着!希望OperEuler或UKUI官方能给出更好的的解决方案!)
- 从虚拟机粘贴文件时偶尔会出现 “不支持的操作” 错误(已在下面解决)
- 复制 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 让它的命令行使用方式也能处理未登录的网路请求
具体步骤
- 在 main-window.h 中的 MainWindow 的类声明中加入以下内容:
plaintext
private:
bool isFirstStartSmbUri = false;
QString smbUrl = nullptr;
- 将 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 方法,会因为主窗口还没有初始化,而发生访问空指针错误。正确的方法是先让它以一个文件目录完成初始化,然后再访问网络路径。
- 核心改造
在 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());
测试
粘贴出错文件,发现已能正常粘贴文件。