Код:
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)