[Solved] - Qt - GUI - Problem with Reference / Pointers
-
Hallo,
I am learning C++ and trying to re-implement / add some code to the application that I gathered from the base of examples of Qt. It's about the Qt C++ GUI application. I have got a problem with sending by a reference a variable to a function ( actually to two functions - to which functions I created the buttons ). In the constructor I defined a variable named 'click' of the int type. Names of these functions are:
forward(); and backwards();
I sent the click variable to these functions by reference, like:
forward(&click); backwards(&click);
and the functions are:
void MainWindow::forward() { (*click_forward)++; } void MainWindow::backwards() { (*click_backwards)--; }
In the header file, I defined these two functions as:
forward(); backwards();
I also defined the connections SIGNAL-SLOT, as:
QObject::connect(nextbtn, &QPushButton::clicked, this, &MainWindow::forward()); QObject::connect(beforebtn, &QPushButton::clicked, this, &MainWindow::backwards());
But when I compile the program, I receive an error like: no matching function for call to 'MainWindow::forward(int*); no matching function for call to 'MainWindow::backwards(int*);
When I put the parameters into the above functions:
MainWindow::forward(int *click_forward) { } MainWindow::backwards(int *click_backwards) { }
I received an error, like: /opt/Qt/5.4/gcc_64/include/QtCore/qglobal.h:694: błąd: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>' enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)} Could I please ask you to direct me, what I am doing wrong? Thank you, ^
-
Hi and welcome to devnet,
Qt is a C++ framework so the first requirement to learn how to use it is to have a good knowledge of the language.
The first concept is the declaration/definition of a method: in both case the signature of the function MUST be the same.
In you case you don't neet to pass arguments to your slots
// MainWindow.h class MainWindow: public QWidget { Q_OBJECT // you need it to use signals/slots public: MainWIndow(QWidget *parent=0); public slots: void forward(); void backward(); private: int _click; };
// MainWindow.cpp MainWindow::MainWindow(QWidget* parent): QWidget(parent) { ..... connect(nextbtn, &QPushButton::clicked, this, &MainWindow::forward); connect(beforebtn, &QPushButton::clicked, this, &MainWindow::backward); } void MainWindow::backward() { _click--; } void MainWindow::forward() { _click++; }
BTW, I suggest to learn a little bit more the language before to go forward with Qt
-
Hi and welcome to devnet
You are doing a couple of things not correct.
My personal recommendation would be to start with C++ tutorial (e.g. this one, but there are many others) first. The GUI stuff and especially signals and slots make it more difficult. It will be a very frustrating experience when you continue to plow along those lines as you do at the moment.
void foo(int &ref) // here we have a reference { ++ref; } void foo1(int *ptr) // here we have a ponter to an int { *ptr += 1; // increments by one } void main ( int argc, char **argv) { int i; foo(i); // calls by reference foo1(&i); // here the '&' does get the address/pointer }
Those are really the basics in a very tiny nutshell. Both functions do basically the same incrementing by one and also passing back the value. You should go through a tutorial and look especially for those differences in detail.
-
Hi and welcome to devnet,
Qt is a C++ framework so the first requirement to learn how to use it is to have a good knowledge of the language.
The first concept is the declaration/definition of a method: in both case the signature of the function MUST be the same.
In you case you don't neet to pass arguments to your slots
// MainWindow.h class MainWindow: public QWidget { Q_OBJECT // you need it to use signals/slots public: MainWIndow(QWidget *parent=0); public slots: void forward(); void backward(); private: int _click; };
// MainWindow.cpp MainWindow::MainWindow(QWidget* parent): QWidget(parent) { ..... connect(nextbtn, &QPushButton::clicked, this, &MainWindow::forward); connect(beforebtn, &QPushButton::clicked, this, &MainWindow::backward); } void MainWindow::backward() { _click--; } void MainWindow::forward() { _click++; }
BTW, I suggest to learn a little bit more the language before to go forward with Qt
@mcosta Thank you very much for your answer, I know that I have to learn C++ much more, but the thing is, that I would like to implement the GUI application - where users would have the manual ability to interact with the program. I understand that, frameworks themselves have got a lot of things which you have to deal with - I mean probably more that the language (C++) itself. May be you could suggest any other framework for C++ which I could use under Linux just to try to implement the code (GUI) and in the same time learn C++, or just to learn faster C++ and Qt? Once again, thank you.
-
Hi and welcome to devnet
You are doing a couple of things not correct.
My personal recommendation would be to start with C++ tutorial (e.g. this one, but there are many others) first. The GUI stuff and especially signals and slots make it more difficult. It will be a very frustrating experience when you continue to plow along those lines as you do at the moment.
void foo(int &ref) // here we have a reference { ++ref; } void foo1(int *ptr) // here we have a ponter to an int { *ptr += 1; // increments by one } void main ( int argc, char **argv) { int i; foo(i); // calls by reference foo1(&i); // here the '&' does get the address/pointer }
Those are really the basics in a very tiny nutshell. Both functions do basically the same incrementing by one and also passing back the value. You should go through a tutorial and look especially for those differences in detail.