Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QSqlTableModel() empty on Ubuntu but works on Windows ?
Forum Update on Monday, May 27th 2025

QSqlTableModel() empty on Ubuntu but works on Windows ?

Scheduled Pinned Locked Moved Solved General and Desktop
qsqltablemodelqsqldatabasepostgresql
41 Posts 4 Posters 8.4k Views
  • 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.
  • J JonB
    12 Jun 2020, 13:46

    @R-P-H
    You sub-class from QSqlDatabaseQSqlTableModel. Personally I would always do that anyway, precisely for this reason --- you never know what you may find you need to add/alter from the supplied QSqlDatabaseQSqlTableModel. (I do this for all QWidgets too, but that's another matter.)

    R Offline
    R Offline
    R-P-H
    wrote on 12 Jun 2020, 14:47 last edited by
    #27

    @JonB said in QSqlTableModel() empty on Ubuntu but works on Windows ?:

    @R-P-H
    You sub-class from QSqlDatabase. Personally I would always do that anyway, precisely for this reason --- you never know what you may find you need to add/alter from the supplied QSqlDatabase. (I do this for all QWidgets too, but that's another matter.)

    Can you please provide an example ?

    J 1 Reply Last reply 12 Jun 2020, 15:01
    0
    • R R-P-H
      12 Jun 2020, 14:47

      @JonB said in QSqlTableModel() empty on Ubuntu but works on Windows ?:

      @R-P-H
      You sub-class from QSqlDatabase. Personally I would always do that anyway, precisely for this reason --- you never know what you may find you need to add/alter from the supplied QSqlDatabase. (I do this for all QWidgets too, but that's another matter.)

      Can you please provide an example ?

      J Offline
      J Offline
      JonB
      wrote on 12 Jun 2020, 15:01 last edited by JonB 6 Dec 2020, 15:08
      #28

      @R-P-H
      Of how to sub-class in C++? It's just basic C++.

      I see @SGaist offered this 7 years ago: https://forum.qt.io/topic/30562/example-of-subclassing-qsqltablemodel/2. You'll want something like:

      // mytablemodel.h
      class MyTableModel : public QSqlTableModel
      {
      public:
      explicit MyTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase() ); // the same arguments as QSqlTableModel
      
      protected:
      virtual QString selectStatement() const;
      };
      
      // mytablemodel.cpp
      MyTableModel::MyTableModel(QObject * parent, QSqlDatabase db) :
      QSqlTableModel(parent, db)
      {
      // the rest of your code
      }
      
      QString MyTableModel::selectStatement() const
      {
          QString ss = QSqlTableModel::selectStatement();
          qDebug() << ss;
          return ss;
      }
      

      I don't think QSqlQuery QSqlQueryModel::query() const is virtual, so you can't override it; nor is it protected, it's public, so just call it if you need to access it.

      R 1 Reply Last reply 15 Jun 2020, 11:44
      0
      • J JonB
        12 Jun 2020, 15:01

        @R-P-H
        Of how to sub-class in C++? It's just basic C++.

        I see @SGaist offered this 7 years ago: https://forum.qt.io/topic/30562/example-of-subclassing-qsqltablemodel/2. You'll want something like:

        // mytablemodel.h
        class MyTableModel : public QSqlTableModel
        {
        public:
        explicit MyTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase() ); // the same arguments as QSqlTableModel
        
        protected:
        virtual QString selectStatement() const;
        };
        
        // mytablemodel.cpp
        MyTableModel::MyTableModel(QObject * parent, QSqlDatabase db) :
        QSqlTableModel(parent, db)
        {
        // the rest of your code
        }
        
        QString MyTableModel::selectStatement() const
        {
            QString ss = QSqlTableModel::selectStatement();
            qDebug() << ss;
            return ss;
        }
        

        I don't think QSqlQuery QSqlQueryModel::query() const is virtual, so you can't override it; nor is it protected, it's public, so just call it if you need to access it.

        R Offline
        R Offline
        R-P-H
        wrote on 15 Jun 2020, 11:44 last edited by
        #29

        @JonB I'm not quite sure how to implement this correctly. I have a class that deals with all database related stuff. Inside that class I have a function that generates the QSqlTableModel using the code you've already seen.

        Now obviously if I create another class for MyTableModel, include it and create model using MyTableModel *model = new MyTableModel(nullptr, db); instead I still get a protected function error when calling its selectStatement() member.

        What would be the correct way of testing this ? Thanks.

        J 1 Reply Last reply 15 Jun 2020, 12:03
        0
        • R R-P-H
          15 Jun 2020, 11:44

          @JonB I'm not quite sure how to implement this correctly. I have a class that deals with all database related stuff. Inside that class I have a function that generates the QSqlTableModel using the code you've already seen.

          Now obviously if I create another class for MyTableModel, include it and create model using MyTableModel *model = new MyTableModel(nullptr, db); instead I still get a protected function error when calling its selectStatement() member.

          What would be the correct way of testing this ? Thanks.

          J Offline
          J Offline
          JonB
          wrote on 15 Jun 2020, 12:03 last edited by JonB
          #30

          @R-P-H

          Inside that class I have a function that generates the QSqlTableModel

          You don't want to directly create a QSqlTableModel anywhere, you want it now to create a MyTableModel. E.g if you currently have a new QSqlTableModel somewhere it now goes new MyTableModel. This is basic C++ sub-classing, I don't know whether you're confused over that.

          include it and create model using MyTableModel *model = new MyTableModel(nullptr, db); instead I still get a protected function error when calling its selectStatement() member.

          Assuming you've got the first bit right, you still cannot call a protected method on an instance from outside of the MyTableModel class code, that's what protected is all about. You will need something like the definition I showed you of QString MyTableModel::selectStatement() const. You can either then write another public method in MyTableModel which calls it and the outside world can go via that public method, or (as I do) override all the methods in MyTableModel which do queries, updates etc. and have them print it out. It takes a few minutes to write these override functions, but once you have them from then on it's a lot easier to see what's going on, do logging, handle any errors etc. from the QSql... classes you use.

          R 1 Reply Last reply 15 Jun 2020, 20:16
          1
          • J JonB
            15 Jun 2020, 12:03

            @R-P-H

            Inside that class I have a function that generates the QSqlTableModel

            You don't want to directly create a QSqlTableModel anywhere, you want it now to create a MyTableModel. E.g if you currently have a new QSqlTableModel somewhere it now goes new MyTableModel. This is basic C++ sub-classing, I don't know whether you're confused over that.

            include it and create model using MyTableModel *model = new MyTableModel(nullptr, db); instead I still get a protected function error when calling its selectStatement() member.

            Assuming you've got the first bit right, you still cannot call a protected method on an instance from outside of the MyTableModel class code, that's what protected is all about. You will need something like the definition I showed you of QString MyTableModel::selectStatement() const. You can either then write another public method in MyTableModel which calls it and the outside world can go via that public method, or (as I do) override all the methods in MyTableModel which do queries, updates etc. and have them print it out. It takes a few minutes to write these override functions, but once you have them from then on it's a lot easier to see what's going on, do logging, handle any errors etc. from the QSql... classes you use.

            R Offline
            R Offline
            R-P-H
            wrote on 15 Jun 2020, 20:16 last edited by
            #31

            @JonB The result of selectStatement() is " ".

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on 15 Jun 2020, 20:28 last edited by
              #32

              Would you be able to provide a small step by step guide to reproduce your test database ? Meaning the command you are currently using on your Linux machine to create the role and the database.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              R 1 Reply Last reply 16 Jun 2020, 19:39
              0
              • SGaistS SGaist
                15 Jun 2020, 20:28

                Would you be able to provide a small step by step guide to reproduce your test database ? Meaning the command you are currently using on your Linux machine to create the role and the database.

                R Offline
                R Offline
                R-P-H
                wrote on 16 Jun 2020, 19:39 last edited by R-P-H
                #33

                @SGaist Hi, I just use psql to create the database/table/user.

                CREATE DATABASE my_db
                    WITH 
                    OWNER = postgres
                    ENCODING = 'UTF8'
                    TABLESPACE = pg_default
                    CONNECTION LIMIT = -1;
                
                CREATE ROLE my_user WITH
                  LOGIN
                  NOSUPERUSER
                  INHERIT
                  NOCREATEDB
                  NOCREATEROLE
                  NOREPLICATION
                  ENCRYPTED PASSWORD 'md5hidden';
                
                CREATE TABLE public.my_table
                (
                    example_column character varying COLLATE pg_catalog."default",
                )
                
                TABLESPACE pg_default;
                
                ALTER TABLE public.my_table OWNER to postgres;
                
                GRANT INSERT, SELECT, DELETE ON TABLE public.my_table TO my_user;
                

                So for example:

                sudo -u postgres psql -c 'one of the above blocks of code'
                

                So here my_db is the database name, my_user is the role I'm using to access the table and my_table is the table name.

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  R-P-H
                  wrote on 18 Jun 2020, 21:00 last edited by
                  #34

                  Is there anything else I can try ?

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 18 Jun 2020, 21:19 last edited by
                    #35

                    Sorry I did not had time to test the database.

                    One thing that you could try (I don't think it would change anything but worth a try), reorder the database setup and add your custom role and it setup both at the end.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    R 1 Reply Last reply 19 Jun 2020, 19:35
                    0
                    • SGaistS SGaist
                      18 Jun 2020, 21:19

                      Sorry I did not had time to test the database.

                      One thing that you could try (I don't think it would change anything but worth a try), reorder the database setup and add your custom role and it setup both at the end.

                      R Offline
                      R Offline
                      R-P-H
                      wrote on 19 Jun 2020, 19:35 last edited by
                      #36

                      @SGaist said in QSqlTableModel() empty on Ubuntu but works on Windows ?:

                      Sorry I did not had time to test the database.

                      One thing that you could try (I don't think it would change anything but worth a try), reorder the database setup and add your custom role and it setup both at the end.

                      I guess I could try that but why would the error be

                      QSqlError("", "Unable to find table logs", "")
                      

                      then ?

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on 10 Jul 2020, 21:48 last edited by
                        #37

                        Gut feeling: PostgreSQL namespace.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        R 1 Reply Last reply 11 Jul 2020, 13:14
                        0
                        • SGaistS SGaist
                          10 Jul 2020, 21:48

                          Gut feeling: PostgreSQL namespace.

                          R Offline
                          R Offline
                          R-P-H
                          wrote on 11 Jul 2020, 13:14 last edited by
                          #38

                          @SGaist said in QSqlTableModel() empty on Ubuntu but works on Windows ?:

                          Gut feeling: PostgreSQL namespace.

                          I had a look, but I don't quite understand how it applies to this...

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on 11 Jul 2020, 19:18 last edited by
                            #39

                            The database role must have access to the namespace in order to access the relation it contains.

                            There might be a glitch there.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            R 1 Reply Last reply 16 Jul 2020, 18:49
                            0
                            • SGaistS SGaist
                              11 Jul 2020, 19:18

                              The database role must have access to the namespace in order to access the relation it contains.

                              There might be a glitch there.

                              R Offline
                              R Offline
                              R-P-H
                              wrote on 16 Jul 2020, 18:49 last edited by
                              #40

                              @SGaist said in QSqlTableModel() empty on Ubuntu but works on Windows ?:

                              The database role must have access to the namespace in order to access the relation it contains.

                              There might be a glitch there.

                              Yet the same role (same exact application/code) works fine on Windows ?

                              1 Reply Last reply
                              0
                              • R Offline
                                R Offline
                                R-P-H
                                wrote on 7 Oct 2020, 14:21 last edited by
                                #41

                                Upgrading to Qt Version 5.15+ solved the issue.

                                1 Reply Last reply
                                1

                                • Login

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