Кодек назначаю
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
и при сборке имею
main.cpp:15: ошибка: неполный тип ‘QTextCodec’ использован во вложенном спецификаторе имени
Без кодека никакие русские буквы в кодировке UTF-8 в QLineEdit на отображаются, только барабер какой-то.
Буду признателен за помощь - Qt только осваиваю.
а чуть больше кода можешь показать?
int main(int argc, char * argv[], char * env[]){
QApplication app(argc,argv,env);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
MyWidget * widget = new MyWidget;
widget->show();
return app.exec();
}
А класс? Класс покажи.
А QLineEdit как используется Отображаешь ты в ней текст так: QLineEdit::setText(QString);? В QString если я не ошибаюсь по дефолту идет кодировка utf-8.
Небольшая заметка:
Я лучше бы использовал QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
А все строки используемые в программе писал бы так tr("строка")
QLineEdit используется как элемент формы MyWidget. В него вводится текст запроса для MySQL. В MyWidget есть таблица для отображения результатов запроса - в ней тоже барабер. MySQL настроен на хранение данных в кодировке UTF-8. После установки Qt все ее диалоги, где есть русские (UTF-8 ) буквы показывают иероглифы. Подскажите, плз, как правильно настраивать и использовать фичи локализации в Qt.
С этим справился
main.cpp:15: ошибка: неполный тип ‘QTextCodec’ использован во вложенном спецификаторе имени
через
#include <QTextCodec>
Не все. Только русскоязычные. Все, что латинницей написано - выводится нормально. Исходники штатные, с сайта Trolltech. В документации ничего не нашел про опции поддержки локализации при сборке/установке Qt.
А код то покажешь? И все-таки проверь кодировку исходников.
в никсах исходники легко можно конвертнуть в нужную кодировку с помощью iconv
Типовой main.cpp:
/*!
\file main.cpp
\brief Основной файл программы.
*/
#include <QApplication>
#include <QtGui>
#include <QTextCodec>
#include <QLocale>
#include <QTranslator>
#include <QDir>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(mdi);
QDir dir_plugin; // каталог плагинов
QStyle *pStyle; // стиль ПО
QString locale; // язык локали
QTranslator *qttr; // переводчик программы
QStringList list_path; // Список путей
QApplication app(argc, argv);
// Устанавливаем кодеки
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());// без этой кодировки с БД проблема
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()
// Устанавливаем свойства программы (понадобится для настроек)
QCoreApplication::setOrganizationName(QObject::tr("ЗАО \"Мая фирма\""));
QCoreApplication::setApplicationName(QObject::tr("Моя программа"));
// устанавливаем путь к плагинам (добавим каталог бинаря)
dir_plugin = QDir(app.applicationDirPath()+"/plugins/");
list_path << dir_plugin.absolutePath() << app.libraryPaths ();
app.setLibraryPaths(list_path);
// Устанавливаем стили
pStyle = QStyleFactory::create("windowsxp");//Cleanlooks Plastique windows
QApplication::setStyle(pStyle);
app.setPalette(pStyle->standardPalette());
// Устанавливаем превод библиотек Qt
locale = QLocale::system().name(); // запрос языка (например: "ru")
qttr = new QTranslator;
app.load(QString("qt_") + locale); // загрузка файла qt_*.qm
app.installTranslator(qttr); // устанока переводчика
MainWindow mainWin;
mainWin.resize(750, 550);
mainWin.show();
return app.exec();
}
#include "ui_Form.h"
#include <mysql.h>
#include <QTextCodec>
class MyWidget : public QWidget {
private:
MYSQL * Db;
MYSQL_RES * Result;
public:
MyWidget(QWidget * parent = 0);
~MyWidget();
};
int main(int argc, char * argv[], char * env[]){
QApplication app(argc,argv,env);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
MyWidget * widget = new MyWidget;
widget->show();
return app.exec();
}
MyWidget::MyWidget(QWidget * parent):QWidget(parent) {
MYSQL_ROW Row;
unsigned int i,j = 0;
Ui::Form * form = new Ui::Form;
form->setupUi(this);
Db = mysql_init(NULL);
mysql_options(Db,MYSQL_SET_CHARSET_NAME,"utf8");
mysql_real_connect(Db,"127.0.0.1","User","Password","Database",0,NULL,0);
mysql_query(Db,"select * from table_1");
Result = mysql_store_result(Db);
form->tableWidget->setColumnCount(Result->field_count);
form->tableWidget->setRowCount(Result->row_count);
while((Row = mysql_fetch_row(Result))){
for(i = 0; i < Result->field_count; i++){
QTableWidgetItem * newItem = new QTableWidgetItem(Row[i]);
form->tableWidget->setItem(j, i, newItem);
}
j++;
}
}
MyWidget::~MyWidget(){
if(Db) mysql_close(Db);
}
Alex69z, что это за каша?
Alex69z, опиши к чему это сообщение, это у тебя так main.cpp выглядит?
П.С. В Qt так с БД не работают, есть более удобные средства.
Лучше разносить описание класса, и его реализацию по разным файлам.
Замечание: используй тег code=cpp.
QSqlDatabase database = QSqlDatabase::addDatabase("QMYSQL");
database.setDatabaseName(Database);
database.setUserName("User");
database.setPassword("Password");
database.setPort("Port")
database.open();
Для умных людей это может выглядеть как "каша" (не сказать еще хужей...), однако это каша МОЯ и я на ней учусь. Не думаю, что Ваше первое Qt-творение выглядело многим лучше. Однако за отзывы премного благодарен.
Насчет "удобных" и "умных" средств для работы с MySQL - это дело вкуса и уровня мастерства. Дорасту и до этого. А пока вот так - напрямую через MySQL API.
Описание класса и его реализацию конечно же следует разносить в разные файлы. Так и сделаю, только не для пробной программки в 3 десятка строк. Мне хотя бы самые простые вещи понять и обкатать. Глянец наводить будем при содании приложения in lege artis.
Выложи ui-шку я тебе свояю небольшой код. Сравнишь его со своим. Увидишь что через QtSql работать гораздо удобнее.
По теме: Таки кодировка исходников какая?
<ui version="4.0" >
<class>Form</class>
<widget class="QWidget" name="Form" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>292</width>
<height>394</height>
</rect>
</property>
<property name="windowTitle" >
<string/>
</property>
<widget class="QWidget" name="gridLayoutWidget" >
<property name="geometry" >
<rect>
<x>0</x>
<y>10</y>
<width>291</width>
<height>381</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" >
<item row="1" column="0" >
<widget class="QLineEdit" name="lineEdit" />
</item>
<item row="1" column="1" >
<widget class="QPushButton" name="pushButton" >
<property name="text" >
<string>OK</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2" >
<widget class="QTableWidget" name="tableWidget" />
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
С Q_OBJECT уже попробовал - получил пару шишек. Советы Ваши очень ценю и благодарен Вам за участие. Ваш пример пробовал собрать, однако возникли проблемы:
1. app.load(QString("qt_") + locale); // загрузка файла qt_*.qm - метода load() не нашлось ни для QApplication, ни для QCoreApplication...
2. #include "mainwindow.h" - его еще создать надо (в designer'е насколько я понял).
qttr->load(QString("qt_") + locale); // загрузка файла qt_*.qm
я не знаю 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(); //Булевая функция создающая подключение к БД
};
#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;
}
#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();
}
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
HEADERS += class.h
FORMS += Form.ui
SOURCES += class.cpp main.cpp
QT += sql
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; //!< табличное представление.
tableWidget->setModel(model);
qttr->load(QString("qt_") + locale); // загрузка файла qt_*.qm
#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();
}
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
}
Сделал. QLabel не отображается совсем.
molchanoviv, системная локаль учитывается:
Огромное спасибо за помощь. Вы отзывчивые и добрые люди. Буду рад чем-либо Вас отблагодарить - мой e-mail присутствует, прошу писать. Проблему решил и вот что оказалось: Designer во все виджеты пихал шрифт первый ему попавшийся, в первой (арабской) кодировке. Какая-то кривизна была при установке Qt. Ну с этим я как-нибудь разберусь. Принудительно расставил нужные мне параметры Writing system, задал шрифт - и избавился от иероглифов. Сейчас мой виджет отображает данные из MySQL БД.
Да незачто, обращайся. На то он и форум, чтобы помагать людям.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)