[Interest] type casting 5 levels down no error but not proper
Sujan Dasmahapatra
sdh at lmwindpower.com
Wed Apr 25 11:16:03 CEST 2012
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget parent=0);
};
class CDataPage : public QDialog
{
Q_OBJECT
public:
CDataPage(MainWindow *parent=0);
}
class CTabWidget : public QTabWidget
{
Q_OBJECT
public:
CTabWidget(CDataPage *parent=0);
} ;
CTabWidget::CTabWidget(CDataPage *parent) : QTabWidget(parent)
{
}
class CSheet : public QWidget
{
Q_OBJECT
Public:
CSheet(CTabWidget *parent=0);
~CSheet();
};
CSheet::CSheet(CTabWidget *parent) : QWidget(parent)
{
}
MainWindow *mainwin = new MainWindow;
CDataPage *dataPage = new CDataPage(mainwin);
CTabWidget *tabWid = new CTabWidget(dataPage);
CSheet *sheet = new CSheet(tabWid);
Is this correct type castting???
MainWindow *mainwinhandle = qobject_cast<MainWindow * >(
sheet->parent()->parent()->dataPage()->parent())->statusBar()->showMessa
ge(tr("A new plot being added"),5000);
It's crashing...
From: Carel Combrink [mailto:carel.combrink at gmail.com]
Sent: Wednesday, April 25, 2012 12:42 PM
To: Sujan Dasmahapatra
Cc: interest at qt-project.org
Subject: Re: [Interest] type casting 5 levels down no error but not
proper
If your requirement is " Please help me getting the mainwindow handle "
then try something like this:
bool continueSearching = true;
QWidget* widgetParent = NULL;
QMainWindow* mainWindow = NULL;
QWidget* currentWidget = this;
while(continueSearching == true) {
widgetParent = qobject_cast<QWidget*>(currentWidget->parent());
if(widgetParent != NULL) {
currentWidget = widgetParent;
mainWindow = qobject_cast<QMainWindow*>(currentWidget);
if(mainWindow != NULL) {
continueSearching = false;
}
} else {
continueSearching = false;
}
}
if(mainWindow != NULL) {
mainWindow->statusBar()->showMessage(tr("A new plot being
added!!"),5000);
}
The idea is to loop through all of the parents of the widgets until one
is a QMainWindow. The other approaches can also work like a global
mainwindow or something. This can be used to get the QMainWindow of any
QWidget.
Note: I have briefly tested it and it seems to work. It might have
problems but the basic idea is there.
Regards,
On Tue, Apr 24, 2012 at 2:42 PM, Sujan Dasmahapatra
<sdh at lmwindpower.com> wrote:
Thanks Diego and Konstantin for your valuable inputs. I am now doing
qobject_cast for all of them, please check the code snippet below, now
it's crashing at tabWid step. It's giving QASSERT failure. The failure
is happening in the following file
//qscopedpointer.h at the following line QASSERT(d)
inline T *operator->() const
{
Q_ASSERT(d); //this line it's crashing.
return d;
}
[code]
QWidget *wid = qobject_cast<QWidget *>(parent());
CSheet *sheet = qobject _cast<CSheet *>(wid->parent());
QScrollBar *scrollBar = qobject _cast<QScrollBar *>(sheet->parent());
CTabWidget *tabWid = qobject _cast<CTabWidget *>(scrollBar->parent());
// Here it is crashing, QSSERT(d) failure
CDataPage *dataPage = qobject _cast<CDataPage *>(tabWid->parent());
MainWindow *mainwin = qobject _cast<MainWindow *>(dataPage->parent());
mainwin->statusBar()->showMessage(tr("A new plot being added!!"),5000);
[/code]
CTabWidget is a custom class derived from QTabWidget.
Please help me getting the mainwindow handle. Thanks for your reply.
From: Diego Iastrubni [mailto:diegoiast at gmail.com]
Sent: Tuesday, April 24, 2012 5:41 PM
To: Sujan Dasmahapatra
Cc: interest at qt-project.org
Subject: Re: [Interest] type casting 5 levels down no error but not
proper
On Tue, Apr 24, 2012 at 2:58 PM, Sujan Dasmahapatra
<sdh at lmwindpower.com> wrote:
please check the code snippet below:
[code]
QWidget *wid = reinterpret_cast<QWidget *>(parent());
CSheet *sheet = reinterpret_cast<CSheet *>(wid->parent());
QScrollBar *scrollBar = reinterpret_cast<QScrollBar *>(sheet->parent());
CTabWidget *tabWid = reinterpret_cast<CTabWidget
*>(scrollBar->parent());
CDataPage *dataPage = reinterpret_cast<CDataPage *>(tabWid->parent());
MainWindow *mainwin = reinterpret_cast<MainWindow
*>(dataPage->parent());
mainwin->statusBar()->showMessage(tr("A new plot being added!!"),5000);
//[I][SIZE=7]Here it is crashing[/SIZE][/I]
[/code]
You meant
[code]
MainWindow *mainwin = dynamic_cast<MainWindow>(dataPage->parent());
if (mainwin!=NULL) {
// do your thing
}
[/code]
Or use qobject_cast as recommended. This will be faster then
dynamic_cast.
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20120425/9ca4bb35/attachment.html>
More information about the Interest
mailing list