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.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.
  • 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
                  • 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