Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Qt mainWindow lub childWindow - unmovable

Ostatnio zmodyfikowano 2015-12-05 21:48
Autor Wiadomość
Monika90
» 2015-12-04 18:11:41
Ja nie używam Qt w ogóle.

Której wersji Qt używasz? W Qt 5 funkcja winEvent została zstąpiona przez funkcję http://doc.qt.io/qt-5​/qwidget.html#nativeEvent
P-141394
Kefirek
Temat założony przez niniejszego użytkownika
» 2015-12-04 18:26:48
Używam 5. dzięki za info bo właśnie szukałem w dokumentacji i nie mogłem znaleźć.
P-141396
Kefirek
Temat założony przez niniejszego użytkownika
» 2015-12-04 19:11:53
Niestety nie bardzo wiem co podstawić za parametry funkcji. Poza tym po włączeniu prototypu funkcji do klasy Form oraz zdefiniowaniu jej w form.cpp tak jak poniżej:

C/C++
bool Form::nativeEvent( const QByteArray & eventType, void * message, long * result )
{
   
    return true;
}
program się zawiesza.Nie bardzo wiem co przypisać do eventType, próbowałem tak:
C/C++
eventType = QEvent::Move;
ale nie ma efektu. Poza tym nie wiem co przypisać do result, no i trzeci parametr funkcji jest funkcją ??????.
Krótko mówiąc pogmatwało się trochę.
P-141399
Monika90
» 2015-12-04 19:37:22
program się zawiesza
To dobrze, to znaczy że funkcja działa.

eventType = QEvent::Move;
Nie możesz nic do tego przypisać, bo to przecież ma atrybut const.

U mnie dział coś takiego, dla klasy dziedziczącej z QFrame
C/C++
#include <QFrame>
#ifdef _WIN32
#include <windows.h>
#endif

class Native
    : public QFrame
{
    Q_OBJECT
   
    bool nativeEvent( const QByteArray &, void * message, long * result ) override
    {
        #ifdef _WIN32
        auto & msg = * static_cast < const MSG *>( message );
        if( msg.message == WM_MOVING )
        {
            auto & rect = * reinterpret_cast < RECT *>( msg.lParam );
            rect.left = x();
            rect.top = y();
            rect.right = x() + frameGeometry().width();
            rect.bottom = y() + frameGeometry().height();
            * result = true;
            return true;
        }
        #endif
       
        return false;
    }
};
P-141400
Kefirek
Temat założony przez niniejszego użytkownika
» 2015-12-04 19:55:20
Dzięki. Spróbuje Twój kod zgrać z moim programem.
P-141402
Kefirek
Temat założony przez niniejszego użytkownika
» 2015-12-04 20:47:54
....a u mnie nie bardzo to idzie. Mianowicie w klasie Form która dziedziczy po QWidget umieściłem prototyp funkcji,
a w form.cpp jej definicję:
C/C++
bool Form::nativeEvent( const QByteArray &, void * message, long * result ) override
{
    #ifdef _WIN32
    auto & msg = * static_cast < const MSG *>( message );
    if( msg.message == WM_MOVING )
    {
        auto & rect = * reinterpret_cast < RECT *>( msg.lParam );
        rect.left = x();
        rect.top = y();
        rect.right = x() + Form::window()->geometry().width(); //tu zmieniłem z frame.geometry..
        rect.bottom = y() + Form::window()->geometry().height(); //.. i tu też
        * result = true;
        return true;
    }
    #endif
   
    return false;
}
Nagłówki załączyłem dyrektywą #include i niestety wywala dużo błędów:
C/C++
C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 41: blad: virt - specifiers in 'nativeEvent' not allowed outside a class definition
bool Form::nativeEvent( const QByteArray &, void * message, long * result ) override
^

C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp
    : 44
    : blad
    : invalid initialization of reference of type 'int&' from expression of type 'const MSG {aka const tagMSG}' auto & msg = * static_cast < const MSG *>( message );
^

C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 45: blad: request for member 'message' in 'msg', which is of non - class type 'int'
if( msg.message == WM_MOVING )
^

     C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp
    : 47
    : blad
    : request for member 'lParam' in 'msg'
     , which is of non - class type 'int' auto & rect = * reinterpret_cast < RECT *>( msg.lParam );

^

C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 48: blad: request for member 'left' in 'rect', which is of non - class type 'int'
rect.left = x();
^
C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 49: blad: request for member 'top' in 'rect', which is of non - class type 'int'
rect.top = y();
^
C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 50: blad: request for member 'right' in 'rect', which is of non - class type 'int'
rect.right = x() + Form::window()->geometry().width();
^
C:\U sers\S.Piernikowski\Desktop\QFiles\Magnus\form.cpp: 51: blad: request for member 'bottom' in 'rect', which is of non - class type 'int'
rect.bottom = y() + Form::window()->geometry().height();
^
P-141409
Monika90
» 2015-12-04 21:08:28
override powinno być użyte tylko wewnątrz definicji klasy, tzn.
C/C++
class Form
{
    bool nativeEvent( const QByteArray &, void * message, long * result ) override; //tutaj powinno być
};

bool Form::nativeEvent( const QByteArray &, void * message, long * result ) //a tu już nie
{
    return false;
}

Żeby używać auto musisz włączyć C++11 (lub lepiej C++14), ewentualnie możesz zastąpić deklaracje z auto, tym:
C/C++
const MSG & msg = * static_cast < MSG *>( message );

i tym:
C/C++
RECT & rect = * reinterpret_cast < RECT *>( msg.lParam );
P-141410
Kefirek
Temat założony przez niniejszego użytkownika
» 2015-12-04 21:45:51
Miło mi zakomunikować, że wszystko OK - miałem jeszcze jeden błąd po poprawkach. Mianowicie override nie mogło być poza ciałem klasy Form, także wyrzuciłem definicję funkcji z form.cpp do klasy Form.
Monika90 jak zwykle się sprawdzasz w najtrudniejszych tematach za to BIG szacun dla Twojej wiedzy i zaangażowania.
Pozdrawiam i jeszcze raz dziękuję za pomoc.
PS te 90 na końcu Twojego nicka to rok urodzenia???
P-141415
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona