Проблема такая: есть сторонняя библиотека, одна из функций которой возвращает char_t*. Это значение необходимо добавить в QListWidget, а он не работает с char_t*. Подскажите, каким образом это можно обойти. Желательно без приведения типов.
Главное с самого начала понять как Qt работает со строками.
В Qt (QString) все строки хранятся в кодировке UNICODE. Сторонние библиотеки могут возвращать строки (char_t*) в других кодировках (CP1251, CP866, KOI8-R, UTF8 и еще огромная куча всяких других).
Для того, что бы использовать такие строки в Qt нужно их конвертировать в UNICODE и соответственно, если необходимо передать в функции сторонней библиотеки строку из QString, ее нужно конвертировать из UNICODE в ту кодировку которую ожидает эта библиотека.
Конвертацией строк занимается объект класса QTextCodec. Пример работы (пусть сторонняя библиотека работает в кодировке CP1251):
C++ (Qt)
// Получаем необходимый кодек
QTextCodec *codec = QTextCodec::codecForName( "Windows-1251" );
// Получение строки QString из char*
const char *fromStr;
QString str = codec->toUnicode( fromStr );
// Получение строки char* из QString
QString fromStr;
const char *str = codec->fromUnicode( fromStr ).constData();
В твоем случае, я бы предложил сделать класс-враппер для твоей сторонней библиотеки, внутри которого и будет происходить конвертация строк. А для использования внутри программы этот класс предлагал аналоги функций из библиотеки с использованием QString:
C++ (Qt)
class SuperLib
{
public:
SuperLib();
QString func1();
void func2( const QString &par1, )
private:
QTextCodec *m_codec;
}
SuperLib::SuperLib()
{
....
m_codec = QTextCodec::codecForName( "Windows-1251" );
}
QString SuperLib::func1()
{
const char *str = mega_function_from_super_lib(.....);
return codec->toUnicode( str );
}
void SuperLib::func2( const QString &str )
{
const char *ptr = codec->fromUnicode().fromUnicode( str );
mega_function_from_super_lib( ptr );
}
Как видишь, если все делать правильно, а не пользоваться костылями, тут не то что без приведения типов не обойтись, а и код специальный писать нужно.