Baca ukuran elemen QML yang ditentukan oleh jangkar.isi: induk

Saya sedang menulis plugin ekstensi QML dan saya sedang mencari cara untuk mengakses ukuran elemen yang baru saja saya terapkan.

Saat ini elemen baru (bernama CustomElement) dapat dibuat dengan ukuran apa pun yang diinginkan pengguna dengan menentukan nilai lebar dan tinggi, sehingga pada file QML pengguna dapat melakukannya :

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

Namun Saya ingin dapat mengambil informasi ukuran ketika pengguna mengonfigurasi ukuran melalui anchor, seperti ini:

Rectangle
{
    width: 800
    height: 600

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

Saya tidak tahu cara mengakses informasi anchors.

Kelas plugin didefinisikan sebagai:

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

Di konstruktor plugin, saya menetapkan QGraphicsItem::ItemHasNoContents ke false:

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

    setFlag(QGraphicsItem::ItemHasNoContents, false);
}

Setelah menambahkan debug, saya perhatikan bahwa parent adalah 0, yang menjelaskan mengapa saya tidak dapat mengambil informasi berguna dengan boundingRect() dan metode lainnya. Ternyata masalahnya plugin saya tidak punya induk. Bagaimana cara mengatasi masalah ini?


person karlphillip    schedule 25.11.2011    source sumber


Jawaban (1)


Terpecahkan.

Membaca Kapan induk ditetapkan? membantu saya menemukan apa yang saya perlukan Mengerjakan. Plugin ini adalah komponen grafis (yaitu memiliki antarmuka visual) yang berarti plugin ini akan ditampilkan di layar pada suatu saat. Ketika Qt selesai memuat komponen Anda, ia memanggil metode bernama componentComplete() untuk memberi tahu Anda tentang hal itu.

Yang harus saya lakukan adalah menambahkan metode ini ke definisi kelas saya sebagai metode publik:

virtual void componentComplete();

dan menerapkannya sebagai:

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

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

Memanggil metode superclass sepertinya menyetel induk plugin saya, dan ini memberi saya akses ke informasi yang disetel oleh anchors.fill: parent.

Maka yang harus saya lakukan untuk mengambil informasi ini adalah:

Q_Q(Video);
qDebug() << "CustomElement::play: widget size is " << q->width() << "x" << q->height();
person karlphillip    schedule 25.11.2011
comment
Anda baru saja mengakhiri pencarian tiga hari!! Yang bisa saya upvote sepuluh kali - person Martin; 17.08.2012
comment
Hmm itu masih tidak berhasil untuk saya. Apa itu Q_D dan Q_Q. Jika saya memanggil Q_D pada nama kelas saya, saya mendapatkan Kesalahan comiler. Bisakah Anda memposting contoh lengkapnya? - person Martin; 17.08.2012