1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#[cfg(not(no_qt))]
use cpp::{cpp, cpp_class};
use crate::core::QByteArray;
use crate::core::QUrl;
use std::fmt::Display;
cpp! {{
#include <QtCore/QString>
#include <QtCore/QUrl>
}}
cpp_class!(
#[derive(PartialEq, PartialOrd, Eq, Ord)]
pub unsafe struct QString as "QString"
);
impl QString {
pub fn to_slice(&self) -> &[u16] {
unsafe {
let mut size: usize = 0;
let c_ptr = cpp!([self as "const QString*", mut size as "size_t"] -> *const u16 as "const QChar*" {
size = self->size();
return self->constData();
});
std::slice::from_raw_parts(c_ptr, size)
}
}
}
impl From<QUrl> for QString {
fn from(qurl: QUrl) -> QString {
cpp!(unsafe [qurl as "QUrl"] -> QString as "QString" {
return qurl.toString();
})
}
}
impl<'a> From<&'a str> for QString {
fn from(s: &'a str) -> QString {
let len = s.len();
let ptr = s.as_ptr();
cpp!(unsafe [len as "size_t", ptr as "char*"] -> QString as "QString" {
return QString::fromUtf8(ptr, len);
})
}
}
impl From<String> for QString {
fn from(s: String) -> QString {
QString::from(&*s)
}
}
impl Into<String> for QString {
fn into(self) -> String {
String::from_utf16_lossy(self.to_slice())
}
}
impl Display for QString {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
QByteArray::from(self.clone()).fmt(f)
}
}
impl std::fmt::Debug for QString {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self)
}
}