[Qt-interest] Dynamic painting in a QMdiArea

Malyushytsky, Alex alex at wai.com
Wed Jan 14 00:40:00 CET 2009


1. Just a wild guess.
Do you have Run Time Type Info enabled? At least with MSVC you can disable it for the project. In this case dynamic_cast always returns NULL.
For QObject derved classes I would use QObject::inherits() instead of dynamic_cast.

To figure out which QWidget pointer you get you could use objectName() and QMetaObject::className().

2. Can't give any comments on second question other that I would assume that viewport of QMdiArea should not depend on children (QMdiSubWindow) and the line location should be defined by Pt1 and Pt2 values in your code.

Best regards,
Alex


-----Original Message-----
From: qt-interest-bounces at trolltech.com [mailto:qt-interest-bounces at trolltech.com] On Behalf Of Pascal Francq
Sent: Tuesday, January 13, 2009 2:41 PM
To: qt-interest at trolltech.com
Subject: Re: [Qt-interest] Dynamic painting in a QMdiArea

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I have solve part of my problems by creating child class of QMdiArea. I have
still two questions.

1. In the method 'mousePressEvent' I try to verify that the current mouse
position correspond to a window.

        void QMyMdiArea::mousePressEvent(QMouseEvent* event)
        {
                QWidget* ptr(viewport()->childAt(event->x(),event->y()));
                if(ptr)
                        cout<<"Child"<<endl;
                else
                {
                        cout<<"No Child"<<endl;
                        return;
                }
                QMdiSubWindow* ptr2=dynamic_cast<QMdiSubWindow*>(ptr);
                if(ptr2)
                        cout<<"Sub"<<endl;
                else
                {
                        cout<<"No Sub"<<endl;
                        return;
                }
        }

When I click on a window, it shows me 'Child' but not 'Sub'. This seems
strange since all the windows I insert inherits from QMdiSubWindow (and
another class depending of the widget contained).

2. When I paint a line in the area, it is paint bellow the sub-windows. How
can I paint it above them.

        void QMyMdiArea::paintEvent(QPaintEvent* event)
        {
                QMdiArea::paintEvent(event);
                QPainter Painter(viewport());
                Painter.setPen(Qt::red);
                Painter.drawLine(Pt1,Pt2);
        }

Thanks.

On mardi 13 janvier 2009, Pascal Francq wrote:
> Hi,
> I have develop an KDE application with a main window (inheriting
> 'KXmlGuiWindow') containing one 'QMdiArea' widget. When multiple windows
> are opened, I want to give the user the opportunity too choose two windows.
> In practice, when clicking on a button in the toolbar, the user clicks on
> one window, holds the mouse button, move to the second window, and release
> the button. This works.
> During the move, I want to draw a (red) line from the first window to the
> actual position of the mouse. The solution I use actually is to catch the
> movement of the mouse in the main KDE window, drawing a line in a QPixmap
> and calling 'updated()'. In the 'paintEvent' method of this KDE window I
> call the 'render' method of the 'QMdiArea' widget:
>
>       void KInfoMng::mouseMoveEvent(QMouseEvent* event)
>       {
>               if(Press)
>               {
>                       Pixmap=new QPixmap(Main->Desktop->size());
>                       QPainter Painter(Pixmap);
>                       Painter.setPen(Qt::red);
>                       Painter.drawLine(firstx,firsty,event->x(),event->y());
>                       update();
>               }
>       }
>
>       void KInfoMng::paintEvent ( QPaintEvent * event )
>       {
>               if(Pixmap)
>               {
>                       Main->Desktop->render(Pixmap);  // The line was draw in Pixmap
>                       Pixmap=0;
>               }
>               else
>                       KXmlGuiWindow::paintEvent(event);
>       }
>
> But the QMdiArea does not show anything. Does this means that I have to
> create a class inheriting from QMdiArea and to overwrite the 'paintEvent'
> method there?
>
> Thanks.


- --

Pascal Francq
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkltGIMACgkQoiZc4N+hp31J/gCfTyELurx6wJh6S1tH0ecBI3br
78wAoJ1uttzHz0S9SkwCDkeJbXMpEzyU
=YYw/
-----END PGP SIGNATURE-----
_______________________________________________
Qt-interest mailing list
Qt-interest at trolltech.com
http://lists.trolltech.com/mailman/listinfo/qt-interest


---------------------------------------------------------------------------------------------------
Weidlinger Associates, Inc. made the following annotations.

"This message and any attachments are solely for the intended recipient and may contain confidential or privileged information. If you are not the intended recipient, any disclosure, copying, use, or distribution of the information included in this message and any attachments is prohibited. If you have received this communication in error, please notify us by reply e-mail and immediately and permanently delete this message and any attachments. Thank you."

"Please consider our environment before printing this email."




More information about the Qt-interest-old mailing list