تغيير حجم QGraphicsItem لتولي كل المساحة في QGraphicsView ، والمشاكل عند تغيير حجم النافذة
-
25-09-2019 - |
سؤال
انا املك QGraphicsItem
(في الواقع ، أ QDeclarativeItem
) وأريد أن تأخذ المساحة المرئية بأكملها QGraphicsView
(مرة أخرى ، إنه في الواقع المشتق QDeclarativeView
الفصل) الذي تمت إضافته. عادة ، يمكنك استخدام QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView)
و QDeclarativeView
سيتم تغيير حجم كائن الجذر تلقائيًا لتناسب العرض.
المشكلة التي أواجهها هي أنني أقوم بإنشاء أداة الجذر يدويًا باستخدام
QDeclarativeComponent component(declarativeView->engine(), QUrl(qml));
QDeclarativeItem* object = qobject_cast<QDeclarativeItem*>(component.create());
if (object)
{
declarativeView->scene()->addItem(object);
...
بدلا من السماح QDeclarativeView
افعلها تلقائيًا عن طريق الاتصال setSource()
. السبب في أنني أفعل ذلك هو أنني أريد تبديل مشهد QML عند حدوث بعض الأحداث ، لكنني لا أريد تدمير المشهد السابق. الدعوة setSource()
يحذف جميع العناصر التي تمت إضافتها من قبل setSource()
يسمى. لذا ، بدلاً من ذلك ، أقوم بإنشاء "كائن الجذر" بنفسي وأضفه إلى المشهد يدويًا.
أنا أستخدم Windows Resizeevent لتغيير حجم بلدي QDeclarativeItem
, ، مثله:
void AppWindow::resizeEvent (QResizeEvent* event)
{
QDeclarativeItem* object = sceneCache.value(sceneName, 0);
if (object)
{
object->setWidth(declarativeView->viewport()->width());
object->setHeight(declarativeView->viewport()->height());
}
}
هذا يعمل! ولكن ، ليست جميلة جدا. إذا قمت بتغيير حجم النافذة بسرعة ، QDeclarativeItem
لم يتم تغيير حجمه بسرعة كافية وترى لفترة وجيزة خلفية رمادية قبل اللحاق بالركب وتغيير حجمها. كما أنها ليست سلسة للغاية.
يحدث هذا فقط إذا كان لدي عنصر معقد يتم تغيير حجمه (في حالتي ، إنه عنصر واجهة مستخدم QWebKit). إنه يعمل بشكل جيد للعناصر الأكثر بساطة. ومع ذلك ، فإن الشيء هو أنه إذا سمحت QDeclarativeView
افعل ذلك ، ليس لدي أي من هذه المشكلات: تغيير حجمه بشكل صحيح وسلس.
أتصور أن هذا ليس خاصًا بالأشياء QTDeclarative ، ولكن بالأحرى QGraphicsView ، على الرغم من أنني ربما يكون مخطئًا هناك.
هل لدى أي شخص أي أفكار؟
المحلول 2
لقد حلت مشاكلي.
يبدو أن المشكلة هي مع عنصر WebView الخاص بـ QML. لقد قمت بتبديلها للحصول على QGraphicsProxyWidget مسجلة من C ++ ، مع ضبط عنصر واجهة المستخدم على QWebview العادي وتختفي جميع المشكلات. يتصرف الآن بالضبط كيف توقعت أن تتصرف WebView.
الجانب السلبي هو أنني بحاجة إلى فضح إشارات/فتحات/خصائص QWebView يدويًا إلى QML. (تحرير: لقد قمت بحل هذا من خلال امتلاك خاصية للقراءة فقط object
, ، الذي يعيد مجموعة القطعة. نظرًا لأنه يتم تحويل Qobjects بشكل تلقائي إلى كائنات يمكن الوصول إليها JavaScript ، يمكنني الوصول إلى عرض الويب ، من أجل exmaple ، مثل هذا: object.url = 'http://google.com'
. للراحة ، أنا أيضًا أؤيد وظيفة init JavaScript Ont He QML ، إذا كانت موجودة ، لذلك أقوم ببساطة بتعيين عرض الويب هناك - يعمل بشكل رائع!)
تغيير آخر أجريته منذ أن طرحت السؤال هو نقل "كائن الجذر" الذي يتحول من C ++ إلى QML نفسه ، من خلال إنشاء مستطيل كامل الشاشة مع وظيفة JavaScript القابلة للتطبيق C ++ والتي تستخدم QT.CreateComponent () لتحميل "QML" الفعلي "QML الفعلي" ملف وربطه مع المراس. وبهذه الطريقة ، يتم تنفيذ المنطق (والتخزين المؤقت للكائنات) في QML ، بدلاً من C ++ ، لذلك يمكنني ببساطة تعيين Source () ، والسماح لـ QT مع التعامل مع تغيير حجم ذلك وأعمل بحتة في QML (لهذا الجزء من التطبيق ، على أي حال).
نصائح أخرى
لست متأكدًا مما إذا كان هذا سيتخلص من الخفقان ولكن يمكنك استخدامه fitInView
في الخاص بك resizeEvent()
:
declarativeView->fitInView(object, Qt::IgnoreAspectRatio);