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