[Решен]ListView SQL как да получа ID?
-
@
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QtSql/QSqlQueryModel>
#include <QtSql/QSqlError>#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setUserName( "nikolay" ); db.setPassword( "*************" ); db.setDatabaseName("Forum"); bool ok = db.open(); if( ok ) { qDebug() << "Database opened!!!"; QSqlQueryModel *model = new QSqlQueryModel( this ); model->setQuery("SELECT * FROM posts", db); ui->tableView->setModel( model ); ui->listView->setModel( model ); ui->listView->setModelColumn( 4 ); connect( ui->pushButton_2, SIGNAL( clicked() ), qApp, SLOT(quit()) ); } else { qDebug() << db.lastError().text(); qApp->quit(); }
}
MainWindow::~MainWindow()
{
delete ui;
}
@Този код при мен работи.
-
Видях къде ми беше грешката- бях сложила
@ui->listView->setModelColumn(1); @
преди
@ui->listView->setModel( model ); @
и за това не се получаваше.
Благодаря за примера :)
Все пак отново изникна проблема, как да взема ID-то като стойност от тази единствена заявка? -
"http://doc.qt.nokia.com/latest/qsqlquerymodel.html#data":http://doc.qt.nokia.com/latest/qsqlquerymodel.html#data
Вземаш индекса на избрания ред (по- горе в примерните кодове го обсъждахме това) и го вадиш от модела по тоя начин.
-
Като взема индекса получавам името на песента. Тогава пак ще опра до 2-рия селект,за да извадя ID, а нали сега идеята е той да се избегне.
-
При намирането на индекса можеш да зададеш коя колона от записите ти трябва. Ако 0 е id-то, 1 е името на песента, трябва да избереш 0. Чакай да видя дали ще мога да изровя малко код.
@
QSqlQueryModel *q = new QSqlQueryModel(this);q->index(ui->listView->selectionModel()->selectedRows().at(0).row(),0,QModelIndex());
@
Набързо го написах това, само модела за да може да ми даде аутокомплийта.
В метода "index" на QSqlQueryModel има три параметъра - ред, колона, родителски индекс. Последния мисля че не е задлжителен. Реда го вземаш от listView-то си, колоната я слагаш такава каквато трябва да отговаря на информацията подадена към модела.Това е, но нямам много опит в тея модели, може и да греша.
-
@
void MainWindow::onClickedSlot( const QModelIndex &index )
{
if ( m_model ) { qDebug() << "TTTTTTTTT"; }if( index.isValid() ) {
// qDebug() << m_model->record( index.row() ).value("post").toString();
qDebug() << ui->listView->model()->data( ui->listView->model()->index( index.row(), 0 ) ).toString(); } else { qDebug() << "invalid index"; }
}
@Малко се забавих, но реда, който е коментира нещо гърми, заради достъпа до m_model :( m_model е private член на MainWindow, но нещо не го достъпва. За това измислих, другият начин. Изглежда грозничко, но работи. При теб "post" трябва да бъде заменено с ID, ако този ред ти проработи.
-
:) супер, още не мога да осмисля логиката, но вече работи :)))
-
Надявам се да съм бил полезен, макар че колегата task_struct май свърши по- добра работа ;-)
-
Ще се опитам да го обясня.
Данните в модела се индексират с като матрица - ред, колона и те са независими от представянето им ( различните вюта не ги променят ). Така когато потребителя натисне ред в QListView се създава QModelIndex за този ред и колона, зададена през setModelColumn. На теб обаче ти трябват данните от друга колона, за това използваме index.row() и колоната си я задаваме сами. В нашият случай е 0.Решението с record().value() мисля, че е по-добро, защото там се използва хеш таблица с имената на колоните и ако си смениш броя на колоните в таблицата в базата данни, няма да се наложи да си променяш програмата.
-
И аз се оглеждах за тоя record, понеже знам че в заявките към базата ползват нещо подобно и е по- добре от колкото да пишеш само цифрите, едно заради улесняване на промените, но и заради по- лесното разбиране на написания код от друг човек (примерно, макар че много пъти и сам съм се чудил на себе си какви съм ги творил :D).
Това което аз имах предвид е именно същото което ти обясни току-що. Знам принципа на действие, но не знам причините :D -
За така наречените "magic numbers" решението е да се използват константи.
В С:
@
#define SmislenoIme stojnost
@В С++:
@
static const type SmislenoIme = stojnost;
@или
@
static const type SmislenoIme(stojnost);
@