QT4 qt3to4 BUG const char -- * QString to const char *

Alles rund um die Programmierung mit Qt
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QT4 qt3to4 BUG const char -- * QString to const char *

Beitrag 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;

}
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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;
    }
}

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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());
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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;
           
}


Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag 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();
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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;
}

Antworten