qt — получает размер ApplicationWindow в переполнении стека

Как вы получаете размер QML ApplicationWindow в C ++?

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

if (engine.rootObjects().isEmpty())
return -1;

QObject *application_object = engine.rootObjects().first();

// Throws ApplicationWindow_QMLTYPE_11::height(int), no such signal
QObject::connect(application_object, SIGNAL(height(int)), &my_obj_here, SLOT(set_game_height(int)));
QObject::connect(application_object, SIGNAL(width(int)), &my_obj_here, SLOT(set_game_width(int)));

return app.exec();

Я понимаю, что я также не получаю размер содержимого ApplicationWindow (за исключением панели инструментов, меню и т. Д.), Но как мне получить к этому доступ?

Пытаясь получить доступ к window собственность на window_object с использованием property Метод возвращает нулевой указатель.

1

Решение

Одним из возможных решений является использование QQmlProperty чтобы получить QQuickItem, затем соединитесь с сигналами heightChanged а также widthChangedэти сигналы только уведомляют об изменении свойства, но не указывают значение, поэтому необходимо использовать метод height() а также width(),

QObject *topLevel = engine.rootObjects().first();
QQuickItem *contentItem =qvariant_cast<QQuickItem *>(QQmlProperty::read(topLevel, "contentItem"));
if(contentItem){
QObject::connect(contentItem, &QQuickItem::heightChanged,
[&my_obj_here, contentItem](){
my_obj_here.set_game_height(contentItem->height());
});
QObject::connect(contentItem, &QQuickItem::widthChanged,
[&my_obj_here, contentItem](){
my_obj_here.set_game_width(contentItem->width());
});
}

Другое решение — установить соединение на QML сторона, для этого вы должны создать q-property:

class GameObject: public QObject{
Q_OBJECT
Q_PROPERTY(int game_width READ game_width WRITE set_game_width NOTIFY game_widthChanged)
Q_PROPERTY(int game_height READ game_height WRITE set_game_height NOTIFY game_heightChanged)
public:
using QObject::QObject;
int game_width() const{
return m_width;
}
void set_game_width(int width){

if(width == m_width)
return;
m_width = width;
emit game_widthChanged();
}
int game_height() const{
return m_height;
}
void set_game_height(int height){
if(height == m_height)
return;
m_height = height;
emit game_heightChanged();
}
signals:
void game_widthChanged();
void game_heightChanged();
private:
int m_width;
int m_height;
};

main.cpp

...
GameObject my_obj_here;

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("my_obj_here", &my_obj_here);
...

main.qml

ApplicationWindow{Connections{
target: contentItem
onHeightChanged:
my_obj_here.game_height = height
onWidthChanged:
my_obj_here.game_width = width
}
...
1

Другие решения

Других решений пока нет …