Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

wchar_t преобразование в string

84K
24 октября 2014 года
alexbo
5 / / 24.10.2014
Здравствуйте, уважаемые форумчане! Необходимо преобразовать переменную wchar_t в string. Работаю в QT. Вывод команды ProcEntry.szExeFile имеет формат wchar_t. Мне нужно вывести имя текущего процесса в listWidget. По синтаксису команды addItem(QString) мне необходима строка. Как провернуть сие преобразование? Перечитал кучу информации, но так и не нашел удобоваримого способа типа преобразования строки в число (QString::toInt()) и т.д. П.С. Суть программы в получении списка процессов, при выборе процесса в listWidget во втором списке открываются все его модули, а lable выводится приоритет процесса. Заранее спасибо!
89K
24 октября 2014 года
Андрэй Сыракваш
2 / / 24.10.2014
Пример преобразования const char* >> const wchar_t* >> QString >> std::string:

Код:
#include <QDebug>
#include <iostream>

using namespace std;

int main()
{
    char char_str[] = "wchar_t string";
    wchar_t  wchar_t_str[100];
    swprintf(wchar_t_str, 100, L"%hs", char_str);
    QString QString_str = QString::fromStdWString(wstring(wchar_t_str));
    string string_str = QString_str.toStdString();
    qDebug() << QString(string_str.c_str());
}
84K
24 октября 2014 года
alexbo
5 / / 24.10.2014
Спасибо!
326
24 октября 2014 года
sadovoya
757 / / 19.11.2005
Можно еще QString::fromWCharArray:

 
Код:
...
const wchar_t *str1 = L"Строка #1 (const wchar_t *str1)";
textEdit->append(QString::fromWCharArray(str1));
...
Для чисел, если от локали зависит (например разделитель точка или запятая), то лучше через объект QLocal:

 
Код:
QString str;
QLocale rus(QLocale::Russian);
...
считываем в str веществ. число
....
double d = rus.toDouble(str);
Ну, и в самой QString конвертеров достаточно для числовых типов и целых и веществ.. Так и не понял, чего вам "удобоваримого" надо :)

P.S. Желательно уточнять, о какой версии Qt идет речь. В 4 и 5 есть различия и в отношении установки кодеков и в отношении конвертаций. В данном случае было не принципиально (если исходник в UTF-8).

PPS Родственнаятема была, но 5 версия имеет свои отличия.
326
26 октября 2014 года
sadovoya
757 / / 19.11.2005
Примеры конвертации целых и вещественных чисел. C QString и QLocale.

Код:
//Codec of this file is UTF-8

//Используем условную компиляцию для Qt4/Qt5
#ifndef QT5_YES //задаем в pro-файле
/*
Такие строки в файл проекта добавляем:
greaterThan(QT_MAJOR_VERSION,4){
    DEFINES += QT5_YES #будет для Qt5
    QT += widgets
}
*/

#include <QtGui>
#include <QTextCodec>
#else
#include <QtWidgets>
#endif


int main(int argv, char **args) {

  QApplication app(argv, args);
#ifndef QT5_YES
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  //а в Qt5 это автоматически
#endif
  //----------------------------------------------------------------------------
  //Делаем крохотный пользовательский интерфейс прямо в main
  //(удобно для небольших примеров, все тогда в одном файле)
  QTextEdit *textEdit = new QTextEdit();
  QPushButton *quitButton = new QPushButton("&Выход");
  QVBoxLayout *layout = new QVBoxLayout();
  layout->addWidget(textEdit);
  layout->addWidget(quitButton);
  QObject::connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
  QWidget w;
  w.setLayout(layout);
  //все -- минимальный GUI готов.
  //----------------------------------------------------------------------------

  w.show();

  textEdit->setText("<b>Примеры конвертации double - QString</b>");
  textEdit->append("");

  double d = 1.055e+77;
  QString c_locale_real_num = QString::number(d);
  textEdit->append(c_locale_real_num);

  c_locale_real_num = "1.777e-5"; //число в Си-локали
  d = c_locale_real_num.toDouble();
  d -= 0.007e-5;
  textEdit->append(QString::number(d));

  QLocale rus(QLocale::Russian);
  QString rus_real_num = "1,534"; //веществ. в русской локали
  d = rus.toDouble(rus_real_num) + 0.006;
  c_locale_real_num.setNum(d);
  textEdit->append(c_locale_real_num);

  textEdit->append("");
  textEdit->append("<b>Примеры конвертации int - QString</b>");
  textEdit->append("");

  int i = 55;
  QString c_locale_int;
  textEdit->append(c_locale_int.setNum(i));
  QString rus_int = "1 555";
  i = rus.toInt(rus_int) + 5;
  textEdit->append(QString::number(i));

  return app.exec();

}
Насчет работы с массивами char и wchar_t -- по-моему, лучше с ними работать напрямую, чем через std::string и std::wstring. Зачем лишнии преобразования, QString и так с ними справляется (а функционально мощней std-строк и с локализацией полный порядок). Если даны std:: строки как исходные, либо в них нужно передавать, то уже конвертировать в массивы не надо -- для этого как раз QString::from/to std.
Если будете работать с Qt, то принимайте QString как основной строковый класс.

Упоминал об отличиях 4 и 5 версии -- вот полезный материал.

Да, чуть не забыл -- еще удобно использовать аргументы QString:

 
Код:
...
  d = 12.05;
  i = 77;
  QString str = QString("Веществ. число d = %1; целое число i = %2").arg(d).arg(i);
  textEdit->append(str);
  ...
326
26 октября 2014 года
sadovoya
757 / / 19.11.2005
ОФТОП, но может кому интересно, пример работы с 16-бит. юникодом. Вывод греческого алфавита:

Код:
//Греческие буквы в юникод
//См.: http://en.wikipedia.org/wiki/Greek_and_Coptic

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel w;
    w.resize(200,50);
    w.show();

    QString greak_alph;
    for(ushort i = 0x03B1; i < 0x03CA; i++)
        greak_alph += QChar(i);
    w.setText(greak_alph);

    return a.exec();
}
392
27 октября 2014 года
cronya
421 / / 03.01.2009
так для crl на с++, думаю есть такая же перегрузка и для Qt

 
Код:
wchar_t* line = L"Text for you";
String^ newLine = gcnew String(line);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог