qt编程,两个QString的值呼唤。

qt编程,两个QString的值呼唤。,第1张

'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比较等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10156874.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存