
'const QString' 这个关键词是const ,既然是常量肯定不能通过直接复、赋值改变其值。而且你算法实现根本没有考虑map这种数据结构内部的实现,基本上可以用sort完成你所预想的目的,但是需要你自己确定比较方式和处理方式。您去读一下stl如何,推荐《泛型编程和STL》这本书。
你试试用QString str(c);
或QString str=QString::fromLatin1(c);
或QString str=QString::fromUtf8(c);
看看哪个好用,然后调用QLineEdit的setText(str)方法显示
我试了一下,可以比较的,
eg:
QTime time = QTime::currentTime();
QString str=timetoString();
只是str的值是带“”符号的,你是不是这原因,如果不是,出现问题是指的是什么
我擦, 你这要能写进去才怪呢。
你obtainputname函数里的一个临时变量想要在这个函数外面使用??
// FILE fp;
// string strname;
// fp=fopen("Macrotestini","w+");
connect(lineEdit,SIGNAL(editingFinished()),this,SLOT(obtainputname()));
// const char str1=strnamec_str();
// fprintf(fp, "%s\n", str1);
void obtainputname()
{
QString strname = lineEdit->text();
FILE fp;
fp=fopen("Macrotestini","w+");
fprintf(fp, "%s\n", strnametoLatin1()data());
fclose(fp);
}
使用下面这个struct来做说明(这里不管是struct还是class都一样):
struct Player
{
int number;
QString firstName;
QString lastName;
};
QVariant
为了能在QVariant中使用自定义数据类型做,需要使用Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示:
struct Player
{
};
Q_DECLARE_METATYPE(Player);
在作为QVariant传递自定义数据类型时,需要使用QVariant::fromValue()或者qVariantFromValue:
Player player;
object->setProperty("property", QVariant::fromValue(player));
为了更方便一点,你可以在自定义类型中定义一个QVariant() 类型转换符:
struct Player
{
operator QVariant() const
{
return QVariant::fromValue(this);
}
};
这样我们便可以像下面这样使用了:
Player player;
object->setProperty("property", player);
信号和槽
对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样:
connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
但在跨线程时如果你还这么做,编译器就会给出警告了:
QObject::connect: Cannot queue arguments of type 'Player'
(Make sure 'Player' is registered using qRegisterMetaType())
这时我们需要先注册Player:
qRegisterMetaType<Player>("Player");
qRegisterMetaType<Player>( ); (上面那个是错误的,除非名字刚好和类名一样)
connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
QDebug
最好是能这样:
qDebug() << player;
而不是这样:
qDebug() << "Player(" << playernumber << "," << playerfirstName << "," << playerlastName << ")";
怎么做呢?我们需要对QDebug<< *** 作符重载一下:
inline QDebug operator<<(QDebug debug, const Player& player)
{
debugnospace() << "Player("
<< playernumber << ","
<< playerfirstName << ","
<< playerlastName << ")";
return debugspace();
}
QDataStream
跟上面的QDebug很像,我们也需要重载一下<< *** 作符:
inline QDataStream& operator<<(QDataStream& out, const Player& player)
{
out << playernumber;
out << playerfirstName;
out << playerlastName;
return out;
}
inline QDataStream& operator>>(QDataStream& in, Player& player)
{
in >> playernumber;
in >> playerfirstName;
in >> playerlastName;
return in;
}
QSettings
QSettings 用QVariant保存键值,用QDataStream序列化自定义数据。(参考后面的variantToString函数)
为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream *** 作符,还必须注册这个流 *** 作符:
qRegisterMetaTypeStreamOperators<Player>("Player");
如此处理之后我们就可以像下面这样使用了:
QSettings settings;
Player player;
settingssetValue("key", player);
QSettings settings;
Player player = value("key")value<Player>();
参考:
QString QSettingsPrivate::variantToString(const QVariant &v)
{
QString result;
switch (vtype()) {
case QVariant::Invalid:
result = QLatin1String("@Invalid()");
break;
case QVariant::ByteArray: {
QByteArray a = vtoByteArray();
result = QLatin1String("@ByteArray(");
result += QString::fromLatin1(aconstData(), asize());
result += QLatin1Char(')');
break;
}
case QVariant::String:
case QVariant::LongLong:
case QVariant::ULongLong:
case QVariant::Int:
case QVariant::UInt:
case QVariant::Bool:
case QVariant::Double:
case QVariant::KeySequence: {
result = vtoString();
if (resultstartsWith(QLatin1Char('@')))
resultprepend(QLatin1Char('@'));
break;
}
#ifndef QT_NO_GEOM_VARIANT
case QVariant::Rect: {
QRect r = qvariant_cast<QRect>(v);
result += QLatin1String("@Rect(");
result += QString::number(rx());
result += QLatin1Char(' ');
result += QString::number(ry());
result += QLatin1Char(' ');
result += QString::number(rwidth());
result += QLatin1Char(' ');
result += QString::number(rheight());
result += QLatin1Char(')');
break;
}
case QVariant::Size: {
QSize s = qvariant_cast<QSize>(v);
result += QLatin1String("@Size(");
result += QString::number(swidth());
result += QLatin1Char(' ');
result += QString::number(sheight());
result += QLatin1Char(')');
break;
}
case QVariant::Point: {
QPoint p = qvariant_cast<QPoint>(v);
result += QLatin1String("@Point(");
result += QString::number(px());
result += QLatin1Char(' ');
result += QString::number(py());
result += QLatin1Char(')');
break;
}
#endif // !QT_NO_GEOM_VARIANT
default: {
#ifndef QT_NO_DATASTREAM
QByteArray a;
{
QDataStream s(&a, QIODevice::WriteOnly);
ssetVersion(QDataStream::Qt_4_0);
s << v;
}
result = QLatin1String("@Variant(");
result += QString::fromLatin1(aconstData(), asize());
result += QLatin1Char(')');
#else
Q_ASSERT(!"QSettings: Cannot save custom types without QDataStream support");
#endif
break;
}
}
return result;
}
qsetting为了让保存的ini文件能和ascii兼容,所以
我们将ini文件中的键值读入到 QVariant 中,需要两个步骤:
因为文件内的一些字符被转义了,比如 "\x1234\t\0"等,所以需要 unescape
从 unescape 后的字符串构造出 QVariant
当将QVariant写入文件时:
将 QVariant 转换成字符串
处理字符串中的特殊字符,即 escape
据我所知,QTextString这个类貌似是不存在的。倒是有个QTextStream类可以用来读取文本数据。
例如下面的函数可以读取小文本文件中的内容
void MainWindow::readFile(const QString& fpath)
{
if(fpathisEmpty())
return;
QFile file(fpath);
if(!fileopen(QIODevice::ReadOnly|QIODevice::Text))
{
qDebug()<<"Open file failure!";
return;
}
QTextStream fs(&file);
QString fileContent (fsreadAll());
qDebug()<<"The content of file is \n"<<fileContent;
}
你需要确保你将正确的文件路径传递给了该函数,否则会导致打开文件失败。
以上就是关于qt编程,两个QString的值呼唤。全部的内容,包括:qt编程,两个QString的值呼唤。、关于QT编程 QlineEdit的问题、QT 编程问题,如果QTime一直在变化,如果获取Qtime时间用来与QString比较等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)