我尝试了以下转换,但都给出了no matching constructor for initialization of 'QStringView'错误(注释反映了我试图调用的构造函数):
string someString = "hello world";
string_view strView( someString );
// QStringView(const Char (&)[N] string = N) or
// QStringView(const Char *str, qsizetype len)
QStringView qStrView1(strView.data(), strView.size());
// QStringView(const Char *first, const Char *last)
QStringView qStrView2(strView.data(), strView.data() + strView.size());
// QStringView(const Char *first, const Char *last)
QStringView qStrView3(strView.begin(), strView.end());
QStringView qStrView3a(strView.cbegin(), strView.cend());
// QStringView(const Char *str)
QStringView qStrView4(strView.data());
Run Code Online (Sandbox Code Playgroud)
(我认为第一个或第二个转换可能有效,出于失望而尝试了第三个和第四个。)
std::strings 复制为s 并从中QString创建s ?QStringViewQStringView到 a 中QTableWidgetItem。我也希望对这个问题有任何帮助。)我读出文件内容,std::string并根据分隔符将其拆分为多行字段。为了有效地做到这一点,我生成了一个std::vectorstd ::string_view来存储字段。现在我想在 Qt GUI 中可视化字符串(实际上是针对QTableWidgetItems),并且认为QStringView可能对 GUI 部分很有帮助。我想让 BusinessLogic 独立于 GUI,因此避免在那里包含任何 Qt 库。
CONFIG += c++17
Run Code Online (Sandbox Code Playgroud)
(我删除了note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided,note: candidate constructor template not viable: requires single argument 'str', but 2 arguments were provided等等)
qStrView1:
qstringview.h:173:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleCharType<char>::value' was not satisfied [with Char = char]
qstringview.h:178:22: note: candidate template ignored: could not match 'const Char *' against 'std::basic_string_view::size_type' (aka 'unsigned long long')
qstringview.h:191:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleArray<const char *>::value' was not satisfied [with Array = const char *]
Run Code Online (Sandbox Code Playgroud)
qStrView2:
qstringview.h:173:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleCharType<char>::value' was not satisfied [with Char = char]
qstringview.h:178:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleCharType<char>::value' was not satisfied [with Char = char]
qstringview.h:191:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleArray<const char *>::value' was not satisfied [with Array = const char *]
Run Code Online (Sandbox Code Playgroud)
qStrView3:
qstringview.h:173:22: note: candidate template ignored: could not match 'const Char *' against 'std::basic_string_view<char, std::char_traits<char> >::const_iterator' (aka '_String_view_iterator<std::char_traits<char> >')
qstringview.h:178:22: note: candidate template ignored: could not match 'const Char *' against 'std::basic_string_view<char, std::char_traits<char> >::const_iterator' (aka '_String_view_iterator<std::char_traits<char> >')
qstringview.h:191:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleArray<std::_String_view_iterator<std::char_traits<char> > >::value' was not satisfied [with Array = std::_String_view_iterator<std::char_traits<char> >]
Run Code Online (Sandbox Code Playgroud)
qStrView3a:
qstringview.h:173:22: note: candidate template ignored: could not match 'const Char *' against 'std::basic_string_view<char, std::char_traits<char> >::const_iterator' (aka '_String_view_iterator<std::char_traits<char> >')
qstringview.h:178:22: note: candidate template ignored: could not match 'const Char *' against 'std::basic_string_view<char, std::char_traits<char> >::const_iterator' (aka '_String_view_iterator<std::char_traits<char> >')
qstringview.h:191:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleArray<std::_String_view_iterator<std::char_traits<char> > >::value' was not satisfied [with Array = std::_String_view_iterator<std::char_traits<char> >]
Run Code Online (Sandbox Code Playgroud)
qStrView4:
qstringview.h:103:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::basic_string_view<char, std::char_traits<char> >::const_pointer' (aka 'const char *') to 'const QStringView' for 1st argument
qstringview.h:103:7: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'std::basic_string_view<char, std::char_traits<char> >::const_pointer' (aka 'const char *') to 'QStringView' for 1st argument
qstringview.h:169:22: note: candidate constructor not viable: no known conversion from 'std::basic_string_view<char, std::char_traits<char> >::const_pointer' (aka 'const char *') to 'std::nullptr_t' (aka 'nullptr_t') for 1st argument
qstringview.h:196:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleArray<const char *>::value' was not satisfied [with Array = const char *]
qstringview.h:200:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatiblePointer<const char *>::value' was not satisfied [with Pointer = const char *]
qstringview.h:209:5: note: candidate template ignored: requirement 'std::is_same<const char *, QString>::value || std::is_same<const char *, QStringRef>::value' was not satisfied [with String = const char *]
qstringview.h:214:22: note: candidate template ignored: requirement 'QtPrivate::IsCompatibleStdBasicString<const char *>::value' was not satisfied [with StdBasicString = const char *]
Run Code Online (Sandbox Code Playgroud)
感谢您向我指出std::wstring。我花了一段时间才理解wchar_t, wstring, wcout, wifstream, ... 的内容,但最终我有以下代码可以工作:
注意:仍然需要CONFIG += 17在 .pro 文件中并包含以下内容
#include <QStringView>\n#include <string_view>\n#include <string>\n\n// create wstring and convert to QStringView\nwstring somewstring = L"abc -\xc3\xa4-\xc3\xb6-\xc3\xbc-\xc3\x9f-"; //!< example string\nwstring_view wview(somewstring);\n// either work:\nQStringView qstrv2a(wview.data(), wview.size());\nQStringView qstrv2b(wview.data(), wview.data() + wview.size());\nRun Code Online (Sandbox Code Playgroud)\n其中上述任何一个构造函数都可以正常工作。
\n// setup minimum GUI\nQWidget* mainWidget = new QWidget(this);\nsetCentralWidget(mainWidget);\nQVBoxLayout* mainLayout = new QVBoxLayout;\nmainWidget->setLayout(mainLayout);\n\n// create wstring and convert to QStringView\nwstring somewstring = L"abc -\xc3\xa4-\xc3\xb6-\xc3\xbc-\xc3\x9f-"; //!< example string\nwstring_view wview(somewstring);\n// either work:\nQStringView qstrv1(wview.data(), wview.size());\n\n// convert to label\nQLabel* otherLabel = new QLabel(qstrv1.toLocal8Bit());\nmainLayout->addWidget(otherLabel);\nRun Code Online (Sandbox Code Playgroud)\n// additinonal standard libararies:\n#include <fstream>\n#include <sstream>\n\n// setup minimum GUI\nQWidget* mainWidget = new QWidget(this);\nsetCentralWidget(mainWidget);\nQVBoxLayout* mainLayout = new QVBoxLayout;\nmainWidget->setLayout(mainLayout);\n\n// read file with UTF-8 characters (to a std::string)\nstd::string tempFileContent;\nifstream file("./infile.txt", ios::binary);\nfile.seekg(0, file.end);\ntempFileContent.resize(file.tellg());\nfile.seekg(0, file.beg);\nfile.read(&tempFileContent[0], tempFileContent.size());\nfile.close();\n\n// convert std::string -> std::wstring\nstd::wstringstream wss;\nwss << tempFileContent.c_str();\nstd::wstring fileContent = wss.str();\n\n// convert std::wstring -> QStringView\n// - either work:\nQStringView qstrv2(fileContent.data(), fileContent.size());\n\n// convert to label\nQLabel* someLabel = new QLabel(qstrv2.toLatin1()); //!< WORKS \nmainLayout->addWidget(someLabel);\n\n/* these did not work:\n// total garbage\nQLabel(QString::fromUtf8(qstrv2.toString().toStdString().c_str()));\n\n// misses just the \'\xc3\x9f\'\nQLabel* someLabel = new QLabel(qstrv2.toLocal8Bit()); \n*/\nRun Code Online (Sandbox Code Playgroud)\n文件内容在哪里
\na-b-c-\xc3\xa4-\xc3\xb6-\xc3\xbc-\xc3\x9f-0-1-2\nRun Code Online (Sandbox Code Playgroud)\nwifstream有趣的是,使用to a 读取文本文件比wstring使用 wstringstream 将读取的字符串转换为 wstring 花费的时间要长得多。(这仍然比读取 std::string 本身慢得多)
| 归档时间: |
|
| 查看次数: |
4180 次 |
| 最近记录: |