Seite 1 von 1
QT4 qt3to4 BUG const char -- * QString to const char *
Verfasst: 7. April 2006 01:30
von patrik08
#include <Qt3Support>
#include <Q3ValueList>
QT += qt3support im pro file ....
im qt3 geht es ja auch von qtsring zu const char * doch im qt4 geht es nicht auch mit qt3 support!
QString.utf8() BUG...
die STATISCHE libs sqlite3_open vollen kein QString... sondern eben const char *
auch wie
http://lists.trolltech.com/qt-interest/ ... 008-0.html
mit .toLatin1() geht nicht!
hier den code ....
bool SQLdb::open(const QString & db)
{
bool ok=false;
int err;
QString first_line = file_get_line(db,1); /* return QString from first line or "" */
QFile file(db);
/* check befor sqlite3 write a new file! */
if (!file.exists()) {
lastErrorMessage = QString( "File \"%1\" could not be read" ).arg( file.fileName() );
return false;
}
if (first_line.size() < 1) {
lastErrorMessage = QString("File could not be read");
return false;
}
if (!first_line.startsWith("SQLite format 3")) {
lastErrorMessage = QString("File is not a SQLite 3 database");
return false;
}
lastErrorMessage = QString("no_error");
err = sqlite3_open(db.utf8(),_db); /* (const char*) error old qt3 = db.utf8()*/
if ( err ) {
lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(_db));
sqlite3_close(_db);
_db = 0;
return false;
}
if (_db){
if (SQLITE_OK==sqlite3_exec(_db,"PRAGMA empty_result_callbacks = ON;",NULL,NULL,NULL)) {
if (SQLITE_OK==sqlite3_exec(_db,"PRAGMA show_datatypes = ON;",NULL,NULL,NULL)) {
ok=true;
}
}
curDBFilename = db;
}
return ok;
}
Verfasst: 7. April 2006 01:55
von patrik08
zum vergleich das "plug-in"... mit eben sqlite3_open16
Code: Alles auswählen
bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts)
{
if (isOpen())
close();
if (db.isEmpty())
return false;
if (sqlite3_open16(db.constData(), &d->access) == SQLITE_OK) {
sqlite3_busy_timeout(d->access, qGetSqliteTimeout(conOpts));
setOpen(true);
setOpenError(false);
return true;
} else {
setLastError(qMakeError(d->access, tr("Error opening database"),
QSqlError::ConnectionError));
setOpenError(true);
return false;
}
}
Verfasst: 7. April 2006 06:35
von Christian81
Ich sehe da zwar nirgends einen Bug, aber versuchs mal mit
Code: Alles auswählen
QString str("test");
fprintf(stderr,"Der String hat folgenden Inhalt: '%s'", str.toUtf8().constData());
Verfasst: 7. April 2006 10:28
von patrik08
es funktioniert ... aber techinsch gesehen nicht zum begreifen..
einen "const Qstring" zu Array und dann mit einem Pointer retour geben!
trodzdem fuer mich ist es ein Bug da vorhandene projekte mit qt3 convertiert mit qt3to4 .. scheitert genau an diese stelle...
QByteArray QString::toUtf8 () const
Returns a UTF-8 representation of the string as a QByteArray.
const QChar * QString::constData () const
Returns a pointer to the data stored in the QString. The pointer can be used to access the characters that compose the string. For convenience, the data is '\0'-terminated.
Code: Alles auswählen
/*
int sqlite3_open(
const char *filename,
sqlite3 **ppDb
);
*/
bool SQLdb::open( const QString & db )
{
bool ok=false;
int err;
QString first_line = file_get_line(db,1); /* return QString from first line or "" */
QFile file(db);
/* check befor sqlite3 write a new file! */
if (!file.exists()) {
lastErrorMessage = QString( "File \"%1\" could not be read" ).arg( file.fileName() );
return false;
}
if (first_line.size() < 1) {
lastErrorMessage = QString("File could not be read");
return false;
}
if (!first_line.startsWith("SQLite format 3")) {
lastErrorMessage = QString("File is not a SQLite 3 database");
return false;
}
lastErrorMessage = QString("no_error");
err = sqlite3_open( db.toUtf8().constData() , &_db ); /* (const char*) error old qt3 = db.utf8()*/
if ( err ) {
lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(_db));
sqlite3_close(_db);
_db = 0;
return false;
}
if (_db){
if (SQLITE_OK==sqlite3_exec(_db,"PRAGMA empty_result_callbacks = ON;",NULL,NULL,NULL)) {
if (SQLITE_OK==sqlite3_exec(_db,"PRAGMA show_datatypes = ON;",NULL,NULL,NULL)) {
ok=true;
}
}
curDBFilename = db;
}
return ok;
}
Verfasst: 7. April 2006 10:39
von Christian81
patrik08 hat geschrieben:es funktioniert ... aber techinsch gesehen nicht zum begreifen..
einen "const Qstring" zu Array und dann mit einem Pointer retour geben!
Wie man es sieht - ein bischen mehr Arbeitsaufwand und ein Grund mehr char * nicht mehr zu benutzen (wo es geht) und bei QString zu bleiben. Sie werden schon ihre Gründe gehabt haben warum sie den Operator dafür in Qt4 weggelassen haben.
trodzdem fuer mich ist es ein Bug da vorhandene projekte mit qt3 convertiert mit qt3to4 .. scheitert genau an diese stelle...
qt3to4 ist ein Helper, kein komplettes Tool ... ohne Nacharbeiten geht das nunmal nicht bei der Anzahl an Änderungen.
Verfasst: 11. April 2006 12:33
von Shadow
Christian81 hat geschrieben:patrik08 hat geschrieben:es funktioniert ... aber techinsch gesehen nicht zum begreifen..
einen "const Qstring" zu Array und dann mit einem Pointer retour geben!
Wie man es sieht - ein bischen mehr Arbeitsaufwand und ein Grund mehr char * nicht mehr zu benutzen (wo es geht) und bei QString zu bleiben. Sie werden schon ihre Gründe gehabt haben warum sie den Operator dafür in Qt4 weggelassen haben.
trodzdem fuer mich ist es ein Bug da vorhandene projekte mit qt3 convertiert mit qt3to4 .. scheitert genau an diese stelle...
qt3to4 ist ein Helper, kein komplettes Tool ... ohne Nacharbeiten geht das nunmal nicht bei der Anzahl an Änderungen.
Zur Not würde bei QT4 noch folgendes gehen:
QString test = "test";
QByteArray ba = test.toAscii();
char* testString = ba.data();
Verfasst: 11. April 2006 14:29
von patrik08
etwa so.... gehts... das ist ja wahnsinnig..... von php UI (PHP-GTK) zu c++ qt...
ich denke die 200 zeile in php =>
http://ciz.ch/svnciz/php-gtk_c++/c++_la ... verter.php
werden schnell 15 mal mehr... mit c++
Code: Alles auswählen
const char* qtascii( QString xml )
{
QByteArray ba = xml.toAscii();
/* __cpu_register__ to find and count on grep */
register const char* hack = ba.data();
return hack;
}