Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Bulgarian
  4. [Решен]ListView SQL как да получа ID?
Forum Updated to NodeBB v4.3 + New Features

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

Scheduled Pinned Locked Moved Bulgarian
31 Posts 4 Posters 12.7k 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.
  • R Offline
    R Offline
    Robbin
    wrote on last edited by
    #2

    Ох, и аз се занимавах скоро с такива неща.
    Краткия отговор е да, може.

    @
    QModelIndex index = model->index(ui->tableView->selectionModel()->selectedRows().at(0).row(), 0, QModelIndex());
    QString id = ui->tableView->model()->data(index).toString();
    @

    Това е което аз съм ползвал. Направил съм при клик на коя да е колона да избира целия ред. Пробвай какъв ще е изхода при теб с qDebug(), предполагам ще е аналогично на това което съм ползвал аз.

    Edit: Сори, при мен е tableView, а ти питаш за listView, но все пак мисля че решението ще е аналогично.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      aleksandra
      wrote on last edited by
      #3

      Благодаря за бързия отговор :)
      Ето какво правя аз:
      на ListView(така или иначе в него са само имената, тъй че би трябвало да си се избира правилният ред) в слот on_listView_clicked написах
      @void Songs::on_listView_clicked(const QModelIndex &index)
      {
      QString id = ui->listView->model()->data(index).toString();
      qDebug() << id;
      }@
      Резултатът е, че като кликна на името на песента, ми се изписва отново името на песента.
      Идея как да получа директно ID-то? (или къде бъркам/не съм разбрала твоя код)

      1 Reply Last reply
      0
      • R Offline
        R Offline
        Robbin
        wrote on last edited by
        #4

        Според мен в този случай или трябва да намериш ID-то от името на песентта, или да използваш tableView където да можеш да добавиш и id и име и каквото е необходимо още в различни "клетки". Това е което аз правя на практика - извеждам информацията от базата данни (в моя случай се записва в ini файл), визуализирам я и при избор търся по уникални идентификатори с които да обработвам по- нататък. При мен няма никакъв user-interaction и информацията е сигурно че не може да съдържа еднакви стойности в два различни записа.

        В listView-то ако не се лъжа е възможно да имаш само една стойност която да ти бъде върната. Може би можеш да провериш вариант при който имаш скрита стойност която да прихванеш с помощта на parent() и children() и в която да се съдържа "скрита" стойност с ID-то(което може да звучи странно за някой който не се е занимавал с уеб разработки ;-) ), или по- добре - да си създадеш списък (QMap, QHash) в който да добавиш id-то за "ключ" и името на песента за стойност, съответно да претърсваш списъка за ключа посредством стойността.

        Сори, наистина не съм сигурен за listView, честно казано за него сигурно знам по- малко от колкото ти знаеш, тъй като не съм се занимавал с тях особено до сега (не ми се е налагало). Предполагам че някой друг ще може да ти помогне със сигурност, това е с което аз мога да помогна.

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

          Кой индекс търсиш? Пореден номер в "QListView":http://doc.qt.nokia.com/latest/qlistview.html или някакво ID от таблицата в базата данни?

          Честно казно нямам особен опит с QListView, но ако само ти трябва поредния номер на селектирания ред в списъка вероятно нещо от сорта ще свърши работа:
          @
          void Songs::on_listView_clicked(const QModelIndex &index)
          {
          int nIndex = index.row();
          qDebug() << nIndex;
          }
          @

          http://anavi.org/

          1 Reply Last reply
          0
          • A Offline
            A Offline
            aleksandra
            wrote on last edited by
            #6

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

            1 Reply Last reply
            0
            • 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
              • R Offline
                R Offline
                Robbin
                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
                  • R Offline
                    R Offline
                    Robbin
                    wrote on last edited by
                    #10

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

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      aleksandra
                      wrote on last edited by
                      #11

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

                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        aleksandra
                        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
                        • R Offline
                          R Offline
                          Robbin
                          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
                            • A Offline
                              A Offline
                              aleksandra
                              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
                                • R Offline
                                  R Offline
                                  Robbin
                                  wrote on last edited by
                                  #17

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

                                  1 Reply Last reply
                                  0
                                  • A Offline
                                    A Offline
                                    aleksandra
                                    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
                                    • R Offline
                                      R Offline
                                      Robbin
                                      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
                                      • A Offline
                                        A Offline
                                        aleksandra
                                        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

                                          • Login

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