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.4k 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.
  • 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
          • A Offline
            A Offline
            aleksandra
            wrote on last edited by
            #22

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

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

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

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

                      :) супер, още не мога да осмисля логиката, но вече работи :)))

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

                        Надявам се да съм бил полезен, макар че колегата task_struct май свърши по- добра работа ;-)

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

                          Ще се опитам да го обясня.
                          Данните в модела се индексират с като матрица - ред, колона и те са независими от представянето им ( различните вюта не ги променят ). Така когато потребителя натисне ред в QListView се създава QModelIndex за този ред и колона, зададена през setModelColumn. На теб обаче ти трябват данните от друга колона, за това използваме index.row() и колоната си я задаваме сами. В нашият случай е 0.

                          Решението с record().value() мисля, че е по-добро, защото там се използва хеш таблица с имената на колоните и ако си смениш броя на колоните в таблицата в базата данни, няма да се наложи да си променяш програмата.

                          "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
                            #30

                            И аз се оглеждах за тоя record, понеже знам че в заявките към базата ползват нещо подобно и е по- добре от колкото да пишеш само цифрите, едно заради улесняване на промените, но и заради по- лесното разбиране на написания код от друг човек (примерно, макар че много пъти и сам съм се чудил на себе си какви съм ги творил :D).
                            Това което аз имах предвид е именно същото което ти обясни току-що. Знам принципа на действие, но не знам причините :D

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

                              За така наречените "magic numbers" решението е да се използват константи.

                              В С:
                              @
                              #define SmislenoIme stojnost
                              @

                              В С++:
                              @
                              static const type SmislenoIme = stojnost;
                              @

                              или
                              @
                              static const type SmislenoIme(stojnost);
                              @

                              "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