Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Bulgarian
  4. [Решен]ListView SQL как да получа ID?
Qt 6.11 is out! See what's new in the release blog

[Решен]ListView SQL как да получа ID?

Scheduled Pinned Locked Moved Bulgarian
31 Posts 4 Posters 22.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    task_struct
    wrote on last edited by
    #7

    Здравей,

    Ти пълниш модела само с данни от колоната Name от Song_tbl, така че няма как после от него да вземеш данните за ID-то.
    Трябва да заредиш в модела Name и ID и да показваш само колоната за име на песента. А когато се кликне на него си взимаш от модела ID-то за съответният ред.

    "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."

    • Linu...
    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #8

      Искаш да замениш :PName с името на песента предполагам.

      @
      QSqlQuery query;
      query.prepare("select id from Song_tbl where Name = ?");
      query.addBindValue(<променливата с името на песента като стринг>);
      query.exec();
      @

      Можеш да ползваш и placeholders:
      @
      query.prepare("select id from Song_tbl where Name = :PName");
      query.bindValue(":PName",<променливата с името на песента като стринг>);
      @

      Edit: Аз докато напиша... оказва се че има и по- лесен вариант :D
      Заради това казах в другата тема че ми е рано още, искам да натрупам повече опит като Qt разработчик първо :)

      1 Reply Last reply
      0
      • L Offline
        L Offline
        leon.anavi
        wrote on last edited by
        #9

        [quote author="aleksandra" date="1314098534"]Търся ID-то в базата данни. Май няма директен начин да се получи, за това мисля да го търся с помощта на друг селект(select id from Song_tbl where Name = :PName). Може ли да ми кажеш как да предам параметърът в заявката?
        Преди съм ползвала борланд с++ билдер и там се използваше ParamByName, но не мога да открия еквивалента му тук.[/quote]

        ОК, този проблем може да се разреши по няколко начина. Най-стандартните, за които се сещам веднага са да правих 2-ра заявка до БД или да направих буферна структура от данни, в която да запазиш име и id, за да имаш само една заявка.

        SQLite ли ползваш?

        Ако ползваш SQLite тези статии ще са ти полезни, за да видиш как да правиш select и да предаваш параметър:
        http://www.developer.nokia.com/Community/Wiki/CS001509_-Selecting_data_from_a_database_without_using_SQL_statements_in_Qt
        http://www.developer.nokia.com/Community/Wiki/CS001507
        -_Searching_for_data_in_a_database_in_Qt

        P.S.

        @task_struct и аз докато напиша отговор вече имаше 2 нови съобщения :)

        http://anavi.org/

        1 Reply Last reply
        0
        • ? Offline
          ? Offline
          A Former User
          wrote on last edited by
          #10

          Не е лошо, нека си помагаме, нека има мнения :D

          1 Reply Last reply
          0
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #11

            Много се радвам на всички отговори :)
            Ползвам SQLite, ще пиша пак, като тествам дадените предложения :)

            1 Reply Last reply
            0
            • ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #12

              @void Songs::on_listView_clicked(const QModelIndex &index)
              {

              QString PName=index.data().toString() ;
              QSqlQuery query;
              QSqlQueryModel *model = new QSqlQueryModel;
              query.prepare("select id from Song_tbl where Name = :PName");
              query.bindValue(":PName",PName);
              query.exec&#40;&#41;;
              model->setQuery(query);
              ui->tableView->setModel(model);
              ui->tableView->show();
              

              }@
              това е кодът, който дава този красив резултат:!http://imageshack.us/photo/my-images/689/dosega.jpg/()!
              Много благодаря за отговорите и се надявам да се включите в следващата тема, която ще отворя за прегледност, защото е друг въпросът :)

              1 Reply Last reply
              0
              • ? Offline
                ? Offline
                A Former User
                wrote on last edited by
                #13

                Темата от операционната система ли идва? Много яко изглежда.
                На по- късен етап може би ще прегледаш варианта който предложи task_struct. Той каза че може да вземеш id и име с една заявка към базата и да ги заредиш в модела от където после можеш да ги изкараш. Аз лично ще трябва да поразгледам пак моделите....

                1 Reply Last reply
                0
                • L Offline
                  L Offline
                  leon.anavi
                  wrote on last edited by
                  #14

                  [quote author="aleksandra" date="1314104474"]това е кодът, който дава този красив резултат:!http://imageshack.us/photo/my-images/689/dosega.jpg/()!
                  Много благодаря за отговорите и се надявам да се включите в следващата тема, която ще отворя за прегледност, защото е друг въпросът :)[/quote]

                  Честито и браво, че си разрешила проблема :)

                  Редактирах заглавието и сложих решен и solved към таговете на темата ;)

                  http://anavi.org/

                  1 Reply Last reply
                  0
                  • ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by
                    #15

                    Предложението на task_struct е много логично, но поне аз доколкото разбирам, е приложимо само ако имам tableView, защото в модела на listView мога да слагам само елементите от един списък.
                    Темата идва от симулатора на Qt за нокия :)

                    1 Reply Last reply
                    0
                    • T Offline
                      T Offline
                      task_struct
                      wrote on last edited by
                      #16

                      QSqlQueryModel e създаден да се показва в QTableView, защото наследява QAbstractTableModel. Нищо не пречи да избереш 2 колони от таблицата и да кажеш на QListView да показва едната. Това става "така":http://doc.trolltech.com/4.7-snapshot/qlistview.html#modelColumn-prop . В момента при теб просто показва първата колона, защото по подразбиране е 0.

                      "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."

                      • Linu...
                      1 Reply Last reply
                      0
                      • ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by
                        #17

                        Мне, не е така, той говори за МОДЕЛА като цяло, не казва нищоз а listView или tableView. Идеята е че модела може да има повече информация от това което визуализираш. Но докато не пробвам и аз дали е така - не мога да твърдя със сигурност :D
                        И май е крайно време и аз да се позанимая с симбиян/мииго/андроид разработките :D
                        (то с тая идея си купих и нов телефон наскоро дори ;-) )

                        1 Reply Last reply
                        0
                        • ? Offline
                          ? Offline
                          A Former User
                          wrote on last edited by
                          #18

                          [quote author="task_struct" date="1314105824"]QSqlQueryModel e създаден да се показва в QTableView, защото наследява QAbstractTableModel. Нищо не пречи да избереш 2 колони от таблицата и да кажеш на QListView да показва едната. Това става "така":http://doc.trolltech.com/4.7-snapshot/qlistview.html#modelColumn-prop . В момента при теб просто показва първата колона, защото по подразбиране е 0.[/quote]
                          опитах по каквъв ли не начин да променя 0 на 1, но явно нямам правилния подход. Когато използвам PropertyEditor-а, стойността не иска да се промени на 1(натисна ли enter се връща на 0), а когато се опитам да го направя с код
                          @ ui->listView->setModelColumn(1);@
                          просто нищо не се променя. Как става променянето?

                          1 Reply Last reply
                          0
                          • ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #19

                            Промени ли заявката към базата да връща двете колони вместо една?
                            @
                            QSqlQueryModel *model = new QSqlQueryModel;
                            model->setQuery("Select Name from Song_tbl");
                            ui->listView->setModel(model);
                            @

                            да стане така:

                            @
                            QSqlQueryModel *model = new QSqlQueryModel;
                            model->setQuery("Select id, Name from Song_tbl");
                            ui->listView->setModel(model);
                            @

                            1 Reply Last reply
                            0
                            • ? Offline
                              ? Offline
                              A Former User
                              wrote on last edited by
                              #20

                              да, но се показват само ID-тата, за да се показва само името, трябва да променя property-то на listView, това не знам как да стане :)

                              1 Reply Last reply
                              0
                              • T Offline
                                T Offline
                                task_struct
                                wrote on last edited by
                                #21

                                @
                                #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;
                                }
                                @

                                Този код при мен работи.

                                "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."

                                • Linu...
                                1 Reply Last reply
                                0
                                • ? Offline
                                  ? Offline
                                  A Former User
                                  wrote on last edited by
                                  #22

                                  Видях къде ми беше грешката- бях сложила
                                  @ui->listView->setModelColumn(1); @
                                  преди
                                  @ui->listView->setModel( model ); @
                                  и за това не се получаваше.
                                  Благодаря за примера :)
                                  Все пак отново изникна проблема, как да взема ID-то като стойност от тази единствена заявка?

                                  1 Reply Last reply
                                  0
                                  • ? Offline
                                    ? Offline
                                    A Former User
                                    wrote on last edited by
                                    #23

                                    "http://doc.qt.nokia.com/latest/qsqlquerymodel.html#data":http://doc.qt.nokia.com/latest/qsqlquerymodel.html#data

                                    Вземаш индекса на избрания ред (по- горе в примерните кодове го обсъждахме това) и го вадиш от модела по тоя начин.

                                    1 Reply Last reply
                                    0
                                    • ? Offline
                                      ? Offline
                                      A Former User
                                      wrote on last edited by
                                      #24

                                      Като взема индекса получавам името на песента. Тогава пак ще опра до 2-рия селект,за да извадя ID, а нали сега идеята е той да се избегне.

                                      1 Reply Last reply
                                      0
                                      • ? Offline
                                        ? Offline
                                        A Former User
                                        wrote on last edited by
                                        #25

                                        При намирането на индекса можеш да зададеш коя колона от записите ти трябва. Ако 0 е id-то, 1 е името на песента, трябва да избереш 0. Чакай да видя дали ще мога да изровя малко код.

                                        @
                                        QSqlQueryModel *q = new QSqlQueryModel(this);

                                        q->index(ui->listView->selectionModel()->selectedRows().at(0).row(),0,QModelIndex());
                                        

                                        @

                                        Набързо го написах това, само модела за да може да ми даде аутокомплийта.
                                        В метода "index" на QSqlQueryModel има три параметъра - ред, колона, родителски индекс. Последния мисля че не е задлжителен. Реда го вземаш от listView-то си, колоната я слагаш такава каквато трябва да отговаря на информацията подадена към модела.

                                        Това е, но нямам много опит в тея модели, може и да греша.

                                        1 Reply Last reply
                                        0
                                        • T Offline
                                          T Offline
                                          task_struct
                                          wrote on last edited by
                                          #26

                                          @
                                          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, ако този ред ти проработи.

                                          "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."

                                          • Linu...
                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt
                                          • Unsolved