Solved Access the UI, from multiple windows.
-
@mrjj But ther is no way to just simply send the widnows object as reference ? Becuse ye, 75% of that setting window is just CheckerBoxe's, but some of stuff is different.
It can help me, but i would like to find 100% solutionI would like to have the same flexibility like in MainWindow.
-
@Loc888
Well u can move the UI object to public section of the class and its accessible from outside but
it leads to spaghetti code and really not recommended.
External users of a class should not know the inner details and hence providing access functions beats
letting everybody know what widgets a window has. -
@mrjj No, i dont like it, even if it helps, i mean make it public. Friend class should help, ye?
And i am not talking about the class, i am talking about object, because like i said, i can access the class from Window1, but i need to access object S_Window from Setting_Window class, and that object is created in MainWindow, that's the problem.
-
@Loc888
Ok, and its not possible to use signals and hook object up
in mainwindow ?
There is nothing stopping you from giving other class a pointer to some widget.
like in mainwindow
Local *local = new Local()
Other *other= new Other()
UseClass *useclass= new UseClass (this, local, other); -
@mrjj I create it with pointer already, i mean the object.
I dont know how to use signal and slots in this example, what and wher should i type to pass the object??
I use it with timers, but not with Windows objects. -
Hi
With signals and slots your would pass the data not the objects.
Normally you hook things up in mainwindow as it knows most other class.
But really depends on where its created etc. -
@mrjj Sorry, but i rly dont understand... I can pass the object here
void MainWindow :: GetWindowData(Settings_Window* S_Window_Temp) { S_Window_Temp = & S_Window; }
So why i cant make a reference to it from another window, if i have the access to pass it??
-
@Loc888
Hi
Im not sure what part is causing your problems.
Maybe we talk about different things.Yes, you can make a reference to a window.
or give a pointer / ref to a window to another window.Like create settings_win in main.cpp
give it to mainwindow.
Mainwindow create a new Window and give settings_win to that also. -
@mrjj Yes, and that's the problem. Maybe i name this topic title a little bit bad, but i dont have any problem with access, because i can access them all.
The problem is, when i pass the window with that function, it's seems like another copy, not reference, so when i change something, nothing happens because it change the copy variables, and i dont know why it happend.
If i pass ther the window object, UI stuff should be ther??
-
@Loc888 Let's clean up your code.
// You need to declare S_Window_Temp as reference to pointer, else you cannot change it inside GetWindowData! void MainWindow :: GetWindowData(Settings_Window* &S_Window_Temp) //<< Here i send Object from Settings_Window created in Window1 { S_Window_Temp = &S_Window; // So i expect C (Object form Window1) should be equal to S_Window (Object form MainWindow ), but it's not. }
Actually you should simply return the pointer from GetWindowData as your current API design is bad (it isn't a good idea to change method parameters from inside the method):
Settings_Window* void MainWindow :: GetWindowData() { return &S_Window; }
-
@jsulm If i just copy and paste, your code, it gives me an error.
The best solution I found is just create the definition of the object in mainwindow.cpp under include, i test it with my own class, and it works exacly how i wanted it.
Unfortunately when i do the same thing with the Window, it crash the application and gives a message:
"QWidget: Must construct a QApplication before a QWidget"
Any way to fix it?
-
Hi,
The usual fix to this one is: don't create static QWidget based objects.
-
@SGaist I dont know what you mean.
-
@Loc888
Hi
You cannot have global Widgets as they are NOT
allow to be constructed before QApplication in main.
They must be pointers and you can first new them After application is created. -
If you have anything that looks like
static MyClass thingy
where MyClass is derived from QWidget, then remove it. -
@mrjj I tried by reference, and this happend:
Error: 'QWidget& QWidget::operator=(const QWidget&)' is private
Class &operator=(const Class &) Q_DECL_EQ_DELETE;
^mingw48_32\include\QtWidgets\qwidget.h:728: in expansion of macro 'Q_DISABLE_COPY'
Q_DISABLE_COPY(QWidget)
^It happend in this line Class &operator=(const Class &) Q_DECL_EQ_DELETE;
I try later with pointers, and will see what happend.
-
For more information why, read this.
-
Now i tried with pointers, error :
error: invalid operands of types 'Settings_Window*' and 'Settings_Window*' to binary 'operator*'
A* &Settings_Widget;
^void MainWindow::Get_Window_Data(Settings_Window* A)
{A* &Settings_Widget;
}
What i did wrong?
-
@Loc888
Hi
Why not just
Settings_Window* MainWindow::Get_Window_Data()
{
return Settings_Widget; // Settings_Widget is * (pointer) ?
} -
It run at least, but is not working. If i check something, then press the button with this code, nothing happened. Probably is another copy.
I am tired, tomorrow i try something else.Is this the way how i should use it?
MainWindow B; if(B.Get_Window_Data()->ui->Checker_Box_01->isChecked()) { //Do something }