Чтение размера элемента QML, определенного с помощью anchors.fill: parent

Я пишу плагин расширения QML и ищу способ получить доступ к размеру элемента, который я только что реализовал.

Прямо сейчас новый элемент (с именем CustomElement) может быть создан с любым размером, который хочет пользователь, определив его значения width и height, поэтому в файле QML пользователь может сделать :

CustomElement 
{
     id: my_elem
     width: 800
     height: 600
}

Но я хотел бы иметь возможность получать информацию о размере, когда пользователь настраивает размер с помощью anchor, например:

Rectangle
{
    width: 800
    height: 600

    CustomElement 
    {
        id: my_elem
        anchors.fill: parent
    }
}

Я понятия не имею, как получить доступ к anchors информации.

Класс плагина определяется как:

class CustomElement: public QDeclarativeItem
{
    Q_OBJECT
    //Q_PROPERTY() stuff
public:
    // ...
};

В конструкторе плагина я установил QGraphicsItem::ItemHasNoContents в false:

CustomElement::CustomElement(QDeclarativeItem* parent)
: QDeclarativeItem(parent)
{
    qDebug() << "CustomElement::CustomElement parent is:" << parent;

    setFlag(QGraphicsItem::ItemHasNoContents, false);
}

После добавления отладки я заметил, что parent равен 0, что объясняет, почему я не могу получить полезную информацию с помощью boundingRect() и других методов. Судя по всему, проблема в том, что у моего плагина нет родителя. Как решить эту проблему?


person karlphillip    schedule 25.11.2011    source источник


Ответы (1)


Решено.

Чтение Когда устанавливается родительский элемент? помогло мне найти то, что мне нужно делать. Этот плагин является графическим компонентом (то есть имеет визуальный интерфейс), что означает, что в какой-то момент он будет отображаться на экране. Когда Qt завершает загрузку вашего компонента, он вызывает метод с именем componentComplete(), чтобы уведомить вас об этом.

Все, что мне нужно было сделать, это добавить этот метод в определение моего класса как открытый метод:

virtual void componentComplete();

и реализовать его как:

void CustomElement::componentComplete()
{
    Q_D(CustomElement);    

    // Call superclass method to set CustomElement() parent
    QDeclarativeItem::componentComplete();   
}

Вызов метода суперкласса, кажется, устанавливает родителя моего плагина, и это дает мне доступ к информации, установленной anchors.fill: parent.

Затем все, что мне нужно было сделать, чтобы получить эту информацию, было:

Q_Q(Video);
qDebug() << "CustomElement::play: widget size is " << q->width() << "x" << q->height();
person karlphillip    schedule 25.11.2011
comment
Вы только что положили конец трехдневному поиску!! Который я мог бы проголосовать десять раз - person Martin; 17.08.2012
comment
Хм, это все еще не работает для меня. Что такое Q_D и Q_Q. Если я вызову Q_D по имени моего класса, я получу ошибку компилятора. Не могли бы вы опубликовать полный пример? - person Martin; 17.08.2012