Access and inheritance
-
@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? -
@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.
-
Hi
In that sample it seems forgotten for mainwindow.
But they do for spreadsheet
Spreadsheet::Spreadsheet(QWidget *parent)
: QTableWidget(parent) <<<<<
{ -
@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! :) -
@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 -
@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?
-
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.htmlNote that we here inherit from QWidget
However, it could have been from any widget. Like QPushButton etc. -
@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? -
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? -
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.
-
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). :) -
@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?
-
@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.
-
Thank you very much. I was too much stuck in a QML program's problem, sorry for the delay.
If you run the program, even by the latest version of Qt Creator and on a sophisticated and fancy operating system like Windows 10, you see the program still looks old, as though we are in 2000 using it.
Is it because of the code? If so, what parts can be updated, please? -
@tomy
Hi
Nope its just how the QWidgets look.
If you change the icons to flat style,
it will look more "modern"You could use something like
https://github.com/laserpants/qt-material-widgets
if you want to go all in for "modern" look.