2012-11-20 103 views
1

错误的行为我有一个问题,从一个类返回从两个函数的const char*,由于某种原因的第一个值是第二值的副本或一些值是不对的,但同时返回值是从不同的指针,在此情况下,两个QMap,下面是两个函数的代码:为const char * Qt中

const char* SomeClass::getSignal(QString signalName) 
{ 
    QString signalsignature = this->signals.value(signalName); 
    signalsignature.prepend(QString::number(QSIGNAL_CODE)); 
    QByteArray ba = signalsignature.toLatin1(); // i try toUTF8 and to Local8Bit 
    const char* signalformated = ba.constData(); 
    return signalformated; 
} 

const char* SomeClass::getSlot(QString slotName) 
{ 
    QString slotsignature = this->slots.value(slotName); 
    slotsignature.prepend(QString::number(QSLOT_CODE)); 
    QByteArray ba = slotsignature.toLatin1(); 
    const char* slotformated = ba.constData(); 
    return slotformated; 
} 

的​​和this->signalsQMap<QString, QString>该保存槽和信号签名(somesignal(int)someslot(bool)连键somesignalsomeslot分别) 。

,我使用的接口,全部采用从它的其他功能工作正常,但使用这些功能这样的使用是从DLL加载由QLibrary类:

const char* signal = someclassinstance->getSignal(tr("clicked")); 
const char* slot = someclassinstance->getSlot(tr("onclicked")); 

cout << "connecting signal " << signal << " to slot " << slot << endl; 

这告诉我:

connecting signal clicked to slot rc 

和错误时,我使用的QObject ::连接

Object::connect: Use the SLOT or SIGNAL macro to connect NovaRadioButton:: rc 

我填的是QMap s是一些功能有:

signals.insert(methodname,QString(metamethod.signature())); 

我不知道我做错了,或者也许是Qt的函数中的错误从QString,感谢您的帮助。

回答

5

当你的函数退出时,ba对象被销毁。您返回的指针指向不再存在的对象的内存位置内部。这是返回指针的基本(和众所周知的)错误当地人:

char* foo() 
{ 
    char c = 'a'; 
    return &c; 
} 

,你正在处理一个QByteArray中,这一事实并不重要;它仍然是一个自动的局部变量,因此在函数退出时被破坏。

而应该直接返回一个QByteArray中,而不是char*。这仍然是有效的,因为QByteArray使用implicit sharing

+0

谢谢你,但不是另一种方式?我返回const char *因为我用它的QObject ::连接(QObject *发射器,常量字符*信号,QObject *接收器,常量字符*槽);所以我想要的是在函数中模拟SIGNAL和SLOT宏,或者如果有另一种方式,我知道我可以返回一个QByteArray并使用.data(),但是如果可能,我想模拟一个SIGNAL和SLOT宏。 –

+0

@DiegoFernandoMurilloValenci在评论中回答太复杂。发表一个新的问题:) –

+0

是的,我做到了,谢谢[链接](http://stackoverflow.com/questions/13485841/how-to-implement-the-macros-signal-and-slot-as-功能-qt)的 –

2

没有错误,你是返回一个指向已被破坏的物体的内部结构。

重写你的函数类似这样的

QByteArray SomeClass::getSignal(QString signalName) 
{ 
    QString signalsignature = this->signals.value(signalName); 
    signalsignature.prepend(QString::number(QSIGNAL_CODE)); 
    return signalsignature.toLatin1(); // i try toUTF8 and to Local8Bit 
} 
0

QByteArray应首选char*。来自Qt文档

QByteArray类提供了一个字节数组。

QByteArray可用于存储原始字节(包括'\ 0's')和 传统的8位'\ 0'终止的字符串。使用QByteArray比使用const char *更方便 。在幕后,它总是 确保数据之后是“\ 0”终止子,并使用隐式 共享(写入时复制),以减少存储器的使用和避免数据不必要 复制。