跳到內容
  • 版面
  • 最新
  • 標籤
  • 熱門
  • 使用者
  • 群組
  • 搜尋
  • Get Qt Extensions
  • Unsolved
Collapse
品牌標誌
  1. 首頁
  2. Qt Development
  3. General and Desktop
  4. Access and inheritance
Forum Updated to NodeBB v4.3 + New Features

Access and inheritance

已排程 已置頂 已鎖定 已移動 Solved General and Desktop
49 貼文 5 Posters 11.8k 瀏覽 4 Watching
  • 從舊到新
  • 從新到舊
  • 最多點贊
回覆
  • 在新貼文中回覆
登入後回覆
此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
  • tomyT 離線
    tomyT 離線
    tomy
    寫於 最後由 編輯
    #1

    Hi,

    Have you studied the spreadsheet program of the official Qt book C++-GUI-Programming-with-Qt-4-2ndEdition?
    There in the createActions() method we have below:

    showGridAction->setChecked(spreadsheet->showGrid());

    where the spreadsheet's header/cpp doesn't have such a method showGrid(), but the spreadsheet inherits from QTableWidget inside which the showGrid() method exists.
    Yes, when that function is called, in reality, it goes and calls QTableWidget's method, I understand that.
    But I think there must have been a method with this name in spreadsheet and inside its definition it should have called its parent's (QTableWidget)showGrid() method.

    Am I not right?

    1 條回覆 最後回覆
    0
    • mrjjM 離線
      mrjjM 離線
      mrjj
      Lifetime Qt Champion
      寫於 最後由 編輯
      #2

      Hi
      You inherit the function into the spreadsheet class, so its callable via spreadsheet without it defining it also.
      It simply calls the base class function.
      Notice however, you inherited public, private or protected which
      decides what function you can call.
      So if you inherited public, you cannot call private functions via the sub class.

      tomyT 1 條回覆 最後回覆
      3
      • mrjjM mrjj

        Hi
        You inherit the function into the spreadsheet class, so its callable via spreadsheet without it defining it also.
        It simply calls the base class function.
        Notice however, you inherited public, private or protected which
        decides what function you can call.
        So if you inherited public, you cannot call private functions via the sub class.

        tomyT 離線
        tomyT 離線
        tomy
        寫於 最後由 編輯
        #3

        @mrjj
        Thank you. It's actually C++, I don't know why I have forgotten it! :(

        Yes, it's public inheritance.
        So, for example, when spreadsheet inherits from QTableWidget publicly, it's just like spreadsheet having a copy of all public functions of QTableWidget inside its public area. Right?

        mrjjM 1 條回覆 最後回覆
        0
        • tomyT tomy

          @mrjj
          Thank you. It's actually C++, I don't know why I have forgotten it! :(

          Yes, it's public inheritance.
          So, for example, when spreadsheet inherits from QTableWidget publicly, it's just like spreadsheet having a copy of all public functions of QTableWidget inside its public area. Right?

          mrjjM 離線
          mrjjM 離線
          mrjj
          Lifetime Qt Champion
          寫於 最後由 mrjj 編輯
          #4

          @tomy
          Hi
          One could say that, but its actually more than a copy of the functions.
          The base class is part of the sub class.
          That is why we need to initialize the base from the subclass when subclass get constructed.

          If you look in Qt samples. You will notice we always call the base class constructor

          MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { << this part calls QMainWindow constructor with the parent parameter.
          ...
          }

          so from subclass MainWindow constructor we also call base class QMainWindow constructor so it can be setup also.

          tomyT 1 條回覆 最後回覆
          2
          • mrjjM mrjj

            @tomy
            Hi
            One could say that, but its actually more than a copy of the functions.
            The base class is part of the sub class.
            That is why we need to initialize the base from the subclass when subclass get constructed.

            If you look in Qt samples. You will notice we always call the base class constructor

            MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { << this part calls QMainWindow constructor with the parent parameter.
            ...
            }

            so from subclass MainWindow constructor we also call base class QMainWindow constructor so it can be setup also.

            tomyT 離線
            tomyT 離線
            tomy
            寫於 最後由 編輯
            #5

            @mrjj
            Hi,
            you're right, but where in the constructor of MainWindow is the constructor of QMainWindow called?

            0_1549793249628_1.PNG
            0_1549793079015_Capture.PNG

            1 條回覆 最後回覆
            0
            • mrjjM 離線
              mrjjM 離線
              mrjj
              Lifetime Qt Champion
              寫於 最後由 編輯
              #6

              Hi
              In that sample it seems forgotten for mainwindow.
              But they do for spreadsheet
              Spreadsheet::Spreadsheet(QWidget *parent)
              : QTableWidget(parent) <<<<<
              {

              tomyT 1 條回覆 最後回覆
              0
              • mrjjM mrjj

                Hi
                In that sample it seems forgotten for mainwindow.
                But they do for spreadsheet
                Spreadsheet::Spreadsheet(QWidget *parent)
                : QTableWidget(parent) <<<<<
                {

                tomyT 離線
                tomyT 離線
                tomy
                寫於 最後由 編輯
                #7

                @mrjj
                Hi,
                So could we have QMainWindow as a subclass of MainWindow without calling its constructor in the constructor of MainWindow?

                By the way, the book says MainWindow as a subclass of QMainWinodw!
                It seems that both are subclasses of each other! :)

                mrjjM 1 條回覆 最後回覆
                0
                • tomyT tomy

                  @mrjj
                  Hi,
                  So could we have QMainWindow as a subclass of MainWindow without calling its constructor in the constructor of MainWindow?

                  By the way, the book says MainWindow as a subclass of QMainWinodw!
                  It seems that both are subclasses of each other! :)

                  mrjjM 離線
                  mrjjM 離線
                  mrjj
                  Lifetime Qt Champion
                  寫於 最後由 編輯
                  #8

                  @tomy
                  hi
                  well its MainWindow as a subclass of QMainWindow
                  The names are so close its sometimes confusing.
                  The truth is, if a base class do not do anything in its constructor, nothing bad will happen not calling it.
                  Which seems why they didnt bother here for MainWindow

                  tomyT kshegunovK 2 條回覆 最後回覆
                  2
                  • mrjjM mrjj

                    @tomy
                    hi
                    well its MainWindow as a subclass of QMainWindow
                    The names are so close its sometimes confusing.
                    The truth is, if a base class do not do anything in its constructor, nothing bad will happen not calling it.
                    Which seems why they didnt bother here for MainWindow

                    tomyT 離線
                    tomyT 離線
                    tomy
                    寫於 最後由 編輯
                    #9

                    @mrjj
                    Hi, thanks, I got it.

                    One other question. In page 70 of that book, about context menu, the following is written:
                    "A more sophisticated way of providing context menus is to reimplement the QWidget::contextMenuEvent() function,
                    create a QMenu widget, populate it with the desired actions, and call exec() on it.
                    "

                    If I want that sophisticated context menu, I need to reimplement the QWidget::contextMenuEvent() function. I found that here, but how to know its code to be able to change that and use it for the application please?

                    mrjjM 1 條回覆 最後回覆
                    0
                    • tomyT tomy

                      @mrjj
                      Hi, thanks, I got it.

                      One other question. In page 70 of that book, about context menu, the following is written:
                      "A more sophisticated way of providing context menus is to reimplement the QWidget::contextMenuEvent() function,
                      create a QMenu widget, populate it with the desired actions, and call exec() on it.
                      "

                      If I want that sophisticated context menu, I need to reimplement the QWidget::contextMenuEvent() function. I found that here, but how to know its code to be able to change that and use it for the application please?

                      mrjjM 離線
                      mrjjM 離線
                      mrjj
                      Lifetime Qt Champion
                      寫於 最後由 mrjj 編輯
                      #10

                      Hi
                      You would create a new subclass.
                      However, it seldom useful for just a context menu and a plain QWidget.
                      So where do you want to use the context menu ?

                      anyway for pure learning.

                      
                      class MyWidget : public QWidget
                      {
                          Q_OBJECT
                      public:
                          explicit MyWidget(QWidget*parent = nullptr) : QWidget(parent)
                          {
                      
                          }
                      protected:
                      // here we then override the defualt one we get from base class to have our own.
                          virtual void contextMenuEvent(QContextMenuEvent *event) override
                          {
                              .....make menu....
                          }
                      };
                      
                      

                      To use it you would either
                      create from code
                      MyWidget *wid=new MyWidget(this)
                      and insert into layout / form.

                      or use Creators promotion feature to allow to use in Designer.
                      https://doc.qt.io/qt-5/designer-using-custom-widgets.html

                      Note that we here inherit from QWidget
                      However, it could have been from any widget. Like QPushButton etc.

                      tomyT 1 條回覆 最後回覆
                      2
                      • mrjjM mrjj

                        Hi
                        You would create a new subclass.
                        However, it seldom useful for just a context menu and a plain QWidget.
                        So where do you want to use the context menu ?

                        anyway for pure learning.

                        
                        class MyWidget : public QWidget
                        {
                            Q_OBJECT
                        public:
                            explicit MyWidget(QWidget*parent = nullptr) : QWidget(parent)
                            {
                        
                            }
                        protected:
                        // here we then override the defualt one we get from base class to have our own.
                            virtual void contextMenuEvent(QContextMenuEvent *event) override
                            {
                                .....make menu....
                            }
                        };
                        
                        

                        To use it you would either
                        create from code
                        MyWidget *wid=new MyWidget(this)
                        and insert into layout / form.

                        or use Creators promotion feature to allow to use in Designer.
                        https://doc.qt.io/qt-5/designer-using-custom-widgets.html

                        Note that we here inherit from QWidget
                        However, it could have been from any widget. Like QPushButton etc.

                        tomyT 離線
                        tomyT 離線
                        tomy
                        寫於 最後由 編輯
                        #11

                        @mrjj
                        Hi, thanks.

                        I forgot to say that I declared it inside the protected modifier area of MainWindow this way:

                        ...
                        protected:
                            void closeEvent(QCloseEvent*); // Previousely added
                            void contextMenuEvent(QContextMenuEvent*); // I, too, added this one
                        ...
                        

                        and it's pure code.

                        I want to use it into the spreadsheet program we talked about, to manipulate the code to have a better context menu for that program.
                        One question as well, what will we achieve by re-implementing that virtual protected method please?

                        mrjjM 1 條回覆 最後回覆
                        0
                        • tomyT tomy

                          @mrjj
                          Hi, thanks.

                          I forgot to say that I declared it inside the protected modifier area of MainWindow this way:

                          ...
                          protected:
                              void closeEvent(QCloseEvent*); // Previousely added
                              void contextMenuEvent(QContextMenuEvent*); // I, too, added this one
                          ...
                          

                          and it's pure code.

                          I want to use it into the spreadsheet program we talked about, to manipulate the code to have a better context menu for that program.
                          One question as well, what will we achieve by re-implementing that virtual protected method please?

                          mrjjM 離線
                          mrjjM 離線
                          mrjj
                          Lifetime Qt Champion
                          寫於 最後由 mrjj 編輯
                          #12

                          Hi
                          If you add contextMenuEvent to MainWindow, then you need
                          to right click the actual MainWindow, to trigger it.
                          It wont be triggered by right clicking on the spreadSheet widget.
                          So not sure having them in MainWindow is what you want ?

                          • One question as well, what will we achieve by re-implementing that virtual protected method please?

                          Well it allows us to override a default contextMenuEvent so for any widget that can actually show a menu already( like QlineEdit)
                          it allows to to alter what should be shown ( a new menu )
                          Or it allows us to add a menu to a QWidget that dont already have such menu.

                          BUT
                          Often the signal is used instead (of the Event ) as that requires no subclass.
                          https://doc.qt.io/qt-5/qwidget.html#customContextMenuRequested
                          That you can just connect to and do get the same effect without subclassing.

                          However, WHAT widget do you want to add contextMenu to ?
                          The spreadsheet?

                          tomyT 1 條回覆 最後回覆
                          3
                          • mrjjM mrjj

                            Hi
                            If you add contextMenuEvent to MainWindow, then you need
                            to right click the actual MainWindow, to trigger it.
                            It wont be triggered by right clicking on the spreadSheet widget.
                            So not sure having them in MainWindow is what you want ?

                            • One question as well, what will we achieve by re-implementing that virtual protected method please?

                            Well it allows us to override a default contextMenuEvent so for any widget that can actually show a menu already( like QlineEdit)
                            it allows to to alter what should be shown ( a new menu )
                            Or it allows us to add a menu to a QWidget that dont already have such menu.

                            BUT
                            Often the signal is used instead (of the Event ) as that requires no subclass.
                            https://doc.qt.io/qt-5/qwidget.html#customContextMenuRequested
                            That you can just connect to and do get the same effect without subclassing.

                            However, WHAT widget do you want to add contextMenu to ?
                            The spreadsheet?

                            tomyT 離線
                            tomyT 離線
                            tomy
                            寫於 最後由 編輯
                            #13

                            @mrjj hi,

                            The spreadsheet?

                            Yes. The area occupied by the cells. It actually will be used for cells.

                            mrjjM 1 條回覆 最後回覆
                            0
                            • tomyT tomy

                              @mrjj hi,

                              The spreadsheet?

                              Yes. The area occupied by the cells. It actually will be used for cells.

                              mrjjM 離線
                              mrjjM 離線
                              mrjj
                              Lifetime Qt Champion
                              寫於 最後由 編輯
                              #14

                              @tomy

                              Hi I would use the SIGNAL then.
                              I assume it has not right click menu already?
                              To use it, you enable it with
                              ui->spreadsheet->setContextMenuPolicy(Qt::CustomContextMenu);
                              (ui->spreadsheet might not be actual name ;)

                              then connect signal to a slot where you build and exec() the menu.

                              tomyT 1 條回覆 最後回覆
                              1
                              • mrjjM mrjj

                                @tomy

                                Hi I would use the SIGNAL then.
                                I assume it has not right click menu already?
                                To use it, you enable it with
                                ui->spreadsheet->setContextMenuPolicy(Qt::CustomContextMenu);
                                (ui->spreadsheet might not be actual name ;)

                                then connect signal to a slot where you build and exec() the menu.

                                tomyT 離線
                                tomyT 離線
                                tomy
                                寫於 最後由 編輯
                                #15

                                @mrjj

                                I assume it has not right click menu already?

                                It has. The author said: "A more sophisticated way of providing context menus is to reimplement the QWidget::contextMenuEvent() function,
                                create a QMenu widget, populate it with the desired actions, and call exec() on it.", so I was motivated to re-implement that method to probably have a nicer or more advanced context menu for the cells!
                                By the way, I like to use pure code only (no design mode). :)

                                mrjjM 1 條回覆 最後回覆
                                0
                                • tomyT tomy

                                  @mrjj

                                  I assume it has not right click menu already?

                                  It has. The author said: "A more sophisticated way of providing context menus is to reimplement the QWidget::contextMenuEvent() function,
                                  create a QMenu widget, populate it with the desired actions, and call exec() on it.", so I was motivated to re-implement that method to probably have a nicer or more advanced context menu for the cells!
                                  By the way, I like to use pure code only (no design mode). :)

                                  mrjjM 離線
                                  mrjjM 離線
                                  mrjj
                                  Lifetime Qt Champion
                                  寫於 最後由 編輯
                                  #16

                                  @tomy
                                  Well im not sure what he meant by that since its just a QMenu in any case.

                                  So what does it have now ?

                                  Im not sure why using event would be more sophisticated. Its just other way
                                  of having a context menu.

                                  tomyT 1 條回覆 最後回覆
                                  1
                                  • mrjjM mrjj

                                    @tomy
                                    Well im not sure what he meant by that since its just a QMenu in any case.

                                    So what does it have now ?

                                    Im not sure why using event would be more sophisticated. Its just other way
                                    of having a context menu.

                                    tomyT 離線
                                    tomyT 離線
                                    tomy
                                    寫於 最後由 編輯
                                    #17

                                    @mrjj

                                    So what does it have now ?

                                    this:

                                    0_1549822272949_Capture.PNG

                                    mrjjM 1 條回覆 最後回覆
                                    0
                                    • tomyT tomy

                                      @mrjj

                                      So what does it have now ?

                                      this:

                                      0_1549822272949_Capture.PNG

                                      mrjjM 離線
                                      mrjjM 離線
                                      mrjj
                                      Lifetime Qt Champion
                                      寫於 最後由 編輯
                                      #18

                                      @tomy
                                      Hi
                                      Is that build from code or a default one ?
                                      I mean is there code to build it and show it ?

                                      tomyT 1 條回覆 最後回覆
                                      0
                                      • mrjjM mrjj

                                        @tomy
                                        Hi
                                        Is that build from code or a default one ?
                                        I mean is there code to build it and show it ?

                                        tomyT 離線
                                        tomyT 離線
                                        tomy
                                        寫於 最後由 編輯
                                        #19

                                        @mrjj Hi,
                                        Yes. The book also shows the code for that.
                                        I know I can add more options to that, for instance, to have five buttons in the context menu rather than that three ones. But by the sentence the author said, I though there should be another way to have a more advanced context menu by re-implementing the virtual protected method when mentioned earlier.

                                        By the way, don't you have that book?

                                        mrjjM 1 條回覆 最後回覆
                                        0
                                        • tomyT tomy

                                          @mrjj Hi,
                                          Yes. The book also shows the code for that.
                                          I know I can add more options to that, for instance, to have five buttons in the context menu rather than that three ones. But by the sentence the author said, I though there should be another way to have a more advanced context menu by re-implementing the virtual protected method when mentioned earlier.

                                          By the way, don't you have that book?

                                          mrjjM 離線
                                          mrjjM 離線
                                          mrjj
                                          Lifetime Qt Champion
                                          寫於 最後由 編輯
                                          #20

                                          @tomy
                                          Hi
                                          Well the menu already have both shortcut and icon so not sure what else could be added.
                                          There is no "more advanced" menu possible by overwriting contextMenuEvent as
                                          you can just 100% the same just altering
                                          void MainWindow::createActions()
                                          to show what you want.

                                          yes, i have it as PDF. did read most of it way back.

                                          tomyT 1 條回覆 最後回覆
                                          2

                                          • 登入

                                          • Login or register to search.
                                          • 第一個貼文
                                            最後的貼文
                                          0
                                          • 版面
                                          • 最新
                                          • 標籤
                                          • 熱門
                                          • 使用者
                                          • 群組
                                          • 搜尋
                                          • Get Qt Extensions
                                          • Unsolved