crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Русская кодировка в Qt, Не видны буквы...
++Norton++
  опции профиля:
сообщение 12.2.2009, 14:58
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Есть такой вот такие куски кода:

if(!test.open(QIODevice::Append | QIODevice::Text)) { ui->statusLabel->setText("Ругаюсь: Не могу открыть файл"); return 1; }


и

QTextStream out1(&test);
QTextStream out2(&counter);

out1 << "This is test: Тест";
out2 << "final";


В первом случае в statusLabel (label) выводятся нечитаемые символы неизвестной кодировки.
Во втором случае в файл записывается только "This is test: ". Слово "Тест" в него вообще не записывается.
Вопрос в том, можно ли как-нибудь это все поправить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.2.2009, 15:13
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Вопрос в том в какой кодировке у тебя исходники. Отсюда и плясать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 12.2.2009, 15:14
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В функции main() указать:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));    ///< Для строковых констант
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));        ///< Для функций перевода tr()

В своем коде сделать так:
if(!test.open(QIODevice::Append | QIODevice::Text)) { ui->statusLabel->setText(tr("Ругаюсь: Не могу открыть файл")); return 1; }

QTextStream out1(&test);
QTextStream out2(&counter);

out1 << "This is test: " << tr("Тест");
out2 << "final";

Скорее всего, поможет! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2009, 15:43
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 12.2.2009, 18:14) *
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); ///< Для строковых констант
Это не для констант, а для внутреннего преобразования QString/QByteArray
и для строк лучше так не задовать кодировку

можно так:
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());  // Для внутренних преобразований Qt
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()


для вывода в консоль можно отдельно задать кодировку:
QTextCodec *concodec = QTextCodec::codecForName(CON_ENCOD);        // Кодек для консоли
QTextStream out(stdout);
out.setCodec(concodec);
out << tr("Мой текст");

CON_ENCOD - требуемый кодек
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 12.2.2009, 16:22
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Спасибо!
Только еще один вопрос. Ругается на строку:
out1 << tr("№") << i << tr(ui->phormulEdit->text()) << i << tr(ui->taskEdit->text());


Пишет:
/home/n0rt0n/doc/programming/TestCreator-1.0.0/TestCreator/widget.cpp:66: error: no matching function for call to 'Widget::tr(QString)'


Что не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2009, 16:23
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 12.2.2009, 19:22) *
Widget::tr(QString)'
Такого типа в Qt нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 12.2.2009, 16:29
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


А как же тогда можно преобразовать текст с помощью tr() из LineEdit'a (phormulEdit)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2009, 16:37
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


от кого унаследован Widget?
приведи объявление этого класса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 12.2.2009, 16:44
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Вот объявление (в widget.cpp):
Widget::Widget(QWidget *parent)
    : QWidget(parent), ui(new Ui::WidgetClass)
{

        ui->setupUi(this);
        connect(ui->createButton, SIGNAL(clicked()), this, SLOT(prepare()));
        connect(ui->nextTask, SIGNAL(clicked()), this, SLOT(generate()));
        connect(ui->saveButton, SIGNAL(clicked()), this, SLOT(finalize()));
}


Вот в widget.h:
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    int checking(int a);

public slots:
    int generate();
    int prepare();
    int finalize();

private:
    Ui::WidgetClass *ui;
};


Сообщение отредактировал ++Norton++ - 12.2.2009, 16:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2009, 16:51
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 12.2.2009, 19:44) *
Вот объявление (в widget.cpp):
это не объявление, а реализация

Цитата(++Norton++ @ 12.2.2009, 19:22) *
tr(ui->phormulEdit->text()) << i << tr(ui->taskEdit->text());
к стати говоря, в функцию tr оборачивай только строковые константы, как здесь:
Цитата(++Norton++ @ 12.2.2009, 19:22) *
tr("№")
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.10.2021, 16:30