crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Кодировки в QT, Не работает отображение русских букв
Litkevich Yuriy
  опции профиля:
сообщение 7.1.2009, 23:27
Сообщение #21


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

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

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




Репутация:   94  


Цитата(Alex69z @ 8.1.2009, 2:16) *
1. app.load(QString("qt_") + locale);
на первых порах он тебе не нужен,
Цитата(Alex69z @ 8.1.2009, 2:16) *
метода load() не нашлось ни для QApplication, ни для QCoreApplication
Что за версия Qt?

Цитата(Alex69z @ 8.1.2009, 2:16) *
2. #include "mainwindow.h" - его еще создать
это то где бы я разместил твой класс.

Ключевой момент:

Цитата(Litkevich Yuriy @ 8.1.2009, 0:50) *
// Устанавливаем кодеки
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());// без этой кодировки с БД проблема
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()
Первый, кодировка локали системы, определяется автоматически
Второй кодек, кодировка твоего файла с кодом (текстового редактора)

Цитата(Litkevich Yuriy @ 8.1.2009, 2:22) *
метода load() не нашлось ни для QApplication, ни для QCoreApplication
Пардон, по опечатка, должно быть так:
qttr->load(QString("qt_") + locale); // загрузка файла qt_*.qm
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 8.1.2009, 0:18
Сообщение #22


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


я не знаю mysql API обьясни мне пожалуйста что представляет из себя row и result? как я понимаю это какие-то классы. В остальном почти готово

Вроде-бы то что ты хотел(насколько я понял mysql API)

class.h
#include "ui_Form.h"    //Подключаем ui-шку
#include <QtGui>    //Подключаем модуль работы с GUI
#include <QtSql>    //Подключаем модуль работы с SQL

class MyWidget : public QWidget, public Ui::Form    //Делаем класс наследником от ui
{
    public:
        MyWidget(QWidget * parent = 0);    
        ~MyWidget();
    private:
        QSqlDatabase database;            //Создаем обьект базы данных.
        bool createConnection();         //Булевая функция создающая подключение к БД
};


class.cpp
#include "class.h"

MyWidget::MyWidget(QWidget * parent):QWidget(parent)
{
    setupUi(this);
    if(createConnection())
    {
        QSqlQuery *sql = new QSqlQuery;
        sql->prepare("select * from table_1");
        sql->exec();
        if(sql->lastError().type() != QSqlError::NoError)
        qDebug()<<sql->lastError().text();
        QSqlRecord rec = sql->record();
        int i=0;
        tableWidget->setColumnCount(sql->size());
        tableWidget->setRowCount(rec.count());
        while(sql->next())
        {
            for(int j=0; j<rec.count(); j++)
            {
                qDebug()<<sql->value(i).toString();
                QTableWidgetItem * newItem = new QTableWidgetItem(sql->value(i).toString());
                tableWidget->setItem(j, i, newItem);
            }
            ++i;
        }
    }
    connect(pushButton,SIGNAL(clicked()),qApp,SLOT(quit()));

}

MyWidget::~MyWidget()
{
    
}

bool MyWidget::createConnection()
{
    database = QSqlDatabase::addDatabase("QMYSQL");    //используем драйвер QMYSQL
    database.setDatabaseName("Database.db");        //Устанавливаем имя БД
    database.setUserName("User");            //Устанавливаем пользователя
    database.setPassword("Password");        //Устанавливаем пароль
    database.setPort("Port")            //Устанавливаем порт

    if(!database.open())
    {
        qDebug()<<"Database is not openned: "<<database.lastError().text();
        return false;
    }
    return true;
}


main.cpp
#include "class.h"

int main(int argc, char * argv[])
{
    QApplication app(argc,argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    MyWidget * widget = new MyWidget;
    widget->show();
    return app.exec();
}


project.pro
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
HEADERS += class.h
FORMS += Form.ui
SOURCES += class.cpp main.cpp
QT += sql


ui-шка та-же.
Естесственно в системе должен стоять мускул и в кьюте должен быть собран драйвер QMYSQL(если ты собирал Qt сам).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.1.2009, 1:25
Сообщение #23


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

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

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




Репутация:   94  


molchanoviv, ты зря ему такой пример пишешь, используешь Виджет вместо модель/представление.

Теперь код для if(createConnection())
  QString tableName;
    
    tableName = "table_1";
    model = new QSqlTableModel(this, database);
qDebug() << model->database();    
qDebug() << "Table list:" << "\n\r"
        << "\t" << model->database().tables();
    model->setTable(tableName);
qDebug() << model->lastError();    

    if (model->lastError().type() != QSqlError::NoError)
    {
        QMessageBox::critical(0, tr("Ошибка"),
                                    tr("Невозможно получить доступ к таблице ")
                                    + "\"" + tableName + "\""
                                    +tr("\n\rПричина: ")
                                    +(model->lastError().databaseText()),
                                    QMessageBox::Cancel);
    }
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    view = new QTableView;
    view->setModel(model);


В заголовочник, в объявление класса добавляем:

    QSqlTableModel        *model;    //!< модель данных.
    QTableView            *view;    //!< табличное представление.


и в pro-файл добавляем:
CONFIG += console

чтобы видеть, что сообщает функция qDebug()

-----
Забыл, что в дизайнере все сделано :(
В дизайнере заменяем виджет на представление (QTableWidget -> QTableView)
и строчка:
Цитата(Litkevich Yuriy @ 8.1.2009, 4:13) *
QTableView *view; //!< табличное представление.
не нужна, а нужно в моем примере исправить
Цитата(Litkevich Yuriy @ 8.1.2009, 4:13) *
view = new QTableView;
view->setModel(model);
на:
    tableWidget->setModel(model);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alex69z
  опции профиля:
сообщение 8.1.2009, 1:47
Сообщение #24


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 7.1.2009
Пользователь №: 480

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 7.1.2009, 23:27) *
Цитата(Alex69z @ 8.1.2009, 2:16) *
1. app.load(QString("qt_") + locale);
на первых порах он тебе не нужен,
Цитата(Alex69z @ 8.1.2009, 2:16) *
метода load() не нашлось ни для QApplication, ни для QCoreApplication
Что за версия Qt?

Цитата(Alex69z @ 8.1.2009, 2:16) *
2. #include "mainwindow.h" - его еще создать
это то где бы я разместил твой класс.

Ключевой момент:

Цитата(Litkevich Yuriy @ 8.1.2009, 0:50) *
// Устанавливаем кодеки
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());// без этой кодировки с БД проблема
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()
Первый, кодировка локали системы, определяется автоматически
Второй кодек, кодировка твоего файла с кодом (текстового редактора)

Цитата(Litkevich Yuriy @ 8.1.2009, 2:22) *
метода load() не нашлось ни для QApplication, ни для QCoreApplication
Пардон, по опечатка, должно быть так:
qttr->load(QString("qt_") + locale); // загрузка файла qt_*.qm



Версия Qt-4.4.3
Настроил кодеки как Вы показали - результат тот же - русские буквы отображаются иероглифами Latin1


Цитата(molchanoviv @ 8.1.2009, 0:18) *
я не знаю mysql API обьясни мне пожалуйста что представляет из себя row и result? как я понимаю это какие-то классы. В остальном почти готово


MYSQL_RES * Result - определяется в mysql.h как typedef srtucut {...} MYSQL_RES. Элемент MySQL API, предназначенный для хранения результата запроса.
MYSQL_ROW Row - строка в результате (курсоре данных). Определяется как typedef MYSQL_ROW char ** в mysql.h.

Желание использовать MySQL API напрямую исходит от того, что только он (API) позволяет манипулировать всей MySQL-системой без посредников. И к тому же он прост, понятен и отменно документирован. Работа через SQL-движок Qt похожа на ODBC-драйвер как мне кажется. По большому счету нет разницы, каким образом добираться до данных. Вопрос в том, что Qt в моих кривых руках не желает ОТОБРАЖАТЬ эти данные. Пытаюсь побороть эту проблему - пока безрезультатно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.1.2009, 1:53
Сообщение #25


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

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

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




Репутация:   94  


Цитата(Alex69z @ 8.1.2009, 4:38) *
как Вы показали
лучше на ты


Цитата(Alex69z @ 8.1.2009, 4:38) *
русские буквы отображаются иероглифами
Тогда, давай с минимума:
main.cpp
#include <QtGui>
#include <QTextCodec>

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  
  QLabel    lb;

    lb.setText(QObject::tr("Привет"));
    lb.show();

    return app.exec();
}

pro-file
TEMPLATE = app
TARGET = tst

# Input
#HEADERS += class.h
#SOURCES += class.cpp
SOURCES += main.cpp

#=========== Config ================
CONFIG += debug_and_release build_all

    DESTDIR     = ./build
    OBJECTS_DIR = ./build/obj
    UI_DIR      = ./build/uic
    MOC_DIR     = ./build/moc
    RCC_DIR        = ./build/rcc


CONFIG (debug, debug|release) {
    OBJECTS_DIR  = $$join(OBJECTS_DIR,,,d)
    TARGET       = $$join(TARGET,,,d)
    CONFIG      += console
}

Делай:
qmake
make
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alex69z
  опции профиля:
сообщение 8.1.2009, 2:02
Сообщение #26


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 7.1.2009
Пользователь №: 480

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




Репутация:   0  


Сделал. QLabel не отображается совсем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.1.2009, 2:14
Сообщение #27


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

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

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




Репутация:   94  


Цитата(Alex69z @ 8.1.2009, 5:02) *
QLabel не отображается совсем.
что запускаешь, tst.exe или tstd.exe?
при запуске последнего, должна появлятся консоль (если из файлового менеджера)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alex69z
  опции профиля:
сообщение 8.1.2009, 2:28
Сообщение #28


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 7.1.2009
Пользователь №: 480

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.1.2009, 2:14) *
Цитата(Alex69z @ 8.1.2009, 5:02) *
QLabel не отображается совсем.
что запускаешь, tst.exe или tstd.exe?
при запуске последнего, должна появлятся консоль (если из файлового менеджера)


Запускал и то и другое - консоль не появляется, виджет тоже. На свою форму бросил QLabel, задал ей текст - обратно иероглифы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.1.2009, 2:35
Сообщение #29


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

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

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




Репутация:   94  


Цитата(Alex69z @ 8.1.2009, 5:28) *
На свою форму бросил QLabel, задал ей текст - обратно иероглифы.
причем здесь форма, если у тебя элементарный код не работает

в чем код пишишь? Компилишь в командной строке?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alex69z
  опции профиля:
сообщение 8.1.2009, 2:38
Сообщение #30


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 7.1.2009
Пользователь №: 480

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.1.2009, 2:35) *
Цитата(Alex69z @ 8.1.2009, 5:28) *
На свою форму бросил QLabel, задал ей текст - обратно иероглифы.
причем здесь форма, если у тебя элементарный код не работает

в чем код пишишь? Компилишь в командной строке?


Пишу в gedit, собираю через make - никакой экзотики.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 1:57