Russian Qt Forum

Qt => Базы данных => Тема начата: pashazz от Июнь 27, 2009, 11:27



Название: Неправильно заполняется дерево.
Отправлено: pashazz от Июнь 27, 2009, 11:27
Код:
Код
C++ (Qt)
HotlinkData::HotlinkData(QString fileName, QWidget *parent)
       : dbfile(fileName), p(parent)
 
{
   //open new connection
      if (!QSqlDatabase::drivers().contains("QSQLITE")){
       QMessageBox::warning(0, QObject::tr("Critical error"), QObject::tr("Unable to load database SQLITE driver. You need to compile qt-sql with sqlite database support"));
       return;
 
  }
      //init parent
      QSqlDatabase db = QSqlDatabase::addDatabase(DRIVER);
      db.setDatabaseName(fileName);
      if(db.open()){
          qDebug() << tr("mosaix: hotlink file open: %1 (format - SQLite3)").arg(fileName);
          //checking tables
         QStringList tables = db.tables();
         if (tables.isEmpty()) //пустая база
         {
             qDebug() << "mosaix: No tables, create TOP table";
             QSqlQuery q ("CREATE TABLE Unitiled_TOP (id INTEGER PIMARY KEY, name TEXT, url TEXT, date TEXT, sort_id INTEGER)", db);
                       }
 
      } else {
          qDebug() << tr("mosaix: error open file %1 - error %2").arg(fileName, db.lastError().text());}
 
}
 
QList <QTreeWidgetItem*> HotlinkData::treeData() {
QList <QTreeWidgetItem*>  par;
   QSqlDatabase db = QSqlDatabase::database();
QStringList tables = db.tables();
//берем таблицу TOP
QStringList top;
foreach (QString table, tables) {
   if (table.endsWith("_TOP")){top  << table;;}
 
}
foreach (QString table, top) {
   QTreeWidgetItem *parent = new QTreeWidgetItem(0);
QString display = table;
 
display.remove("_TOP", Qt::CaseSensitive);
parent->setText(0, display);
parent->setIcon(0,QIcon(":/icons/icons/open-folder.png"));
//working with top table
 makeTable(parent, table);
 par.append(parent);
 qDebug() << "Adding " + parent->text(0) + "  to root, table" << table ;
 
}
return par;
}
 
void HotlinkData::makeTable(QTreeWidgetItem *parent, QString tableName) {
 const QString folder = ":/icons/icons/open-folder.png";
     const QString paper = ":/icons/icons/document-new.png";
     tableName = workstr(tableName);
     QString ptable = patable(tableName);
   QString sq = "SELECT * FROM " +ptable +" ORDER BY sort_id";
   QSqlDatabase db = QSqlDatabase::database();
   QSqlQuery query;
   query.prepare(sq);
   if (!query.exec()) {
       qDebug() << "SQL error: " << query.lastError().text() << query.executedQuery();
   }
   else {qDebug() << "Query done: "  +query.executedQuery() ;}
   int iname = query.record().indexOf("name");
   int iurl = query.record().indexOf("url");
   int idate = query.record().indexOf("date");
 
   while (query.next()) {
       QTreeWidgetItem *myItem = new QTreeWidgetItem(parent);
       QString name = query.value(iname).toString();
       QString url = query.value(iurl).toString();
       qDebug() << "adding "<< name << " , " << url << " to table " + ptable;
        myItem->setText(0, name);
       myItem->setText(1, url);
       if (url != "MENU"){
       QString date = query.value(idate).toString();
        myItem->setText(2, date);
        myItem->setIcon(0, QIcon(paper));
        parent->addChild(myItem);
 
   }
       else {
         //menu
 
           myItem->setIcon(0, QIcon(folder));
           parent->addChild(myItem);
           makeTable(myItem, name);
       }
   }
 
}
 
 
 

Функция treeData возвращает список QTreeWidgetItem, которые должны быть заполнены из SQL базы
Создал 2 папки верхнего уровня, добавил в одну из них закладки, при следующем запуске эти закладки отображаются в обеих папках верхнего уровня.
Извиняюсь за криво составленный вопрос, больше не знаю как. С дебаггером сижу 3-й день подряд.
Сорцы (полные) брыть здесь.
http://github.com/pashazz/mosaix/tree/master

Заранее спасибо.
Файл базы для тестирования вложен, положить в ~/.mosaix/hotlinks (это база sqlite)


Название: Re: Неправильно заполняется дерево.
Отправлено: pashazz от Июнь 27, 2009, 13:55
Разобрался, в одном месте поменял || на &&