سؤال

كلاهما QWebFrame و QWebPage يملك void loadFinished(bool ok) إشارة التي يمكن استخدامها للكشف عند تحميل صفحة ويب بالكامل. المشكلة هي عندما تحتوي صفحة الويب على بعض المحتويات المحملة بشكل غير متزامن (AJAX). كيف تعرف متى يتم تحميل الصفحة بالكامل في هذه الحالة؟

هل كانت مفيدة؟

المحلول

أنا لم أفعل ذلك بالفعل، لكنني أعتقد أنك مايو تكون قادرة على تحقيق الحل الخاص بك باستخدام QNetworkAccessManager.

يمكنك الحصول على QNetworkAccessManager من QWEBGE الخاص بك باستخدام NetworkaccessManager () وظيفة. QNetworkaccessManager لديه إشارة الانتهاء (qetworkreply * الرد) التي يتم إطلاقها كلما طلب ملف QWEBGAGE.

ال finished تمنحك الإشارة مثالا QNetWorkReply، حيث يمكنك الحصول على نسخة من الطلب الأصلي الذي تم إجراؤه، من أجل تحديد الطلب.

لذلك، قم بإنشاء فتحة لإرفاقها على finished إشارة، استخدم طرق QNetWorkReply المرة لمعرفة الملف الذي انتهى للتو من التنزيل وإذا كان طلب AJAX الخاص بك، فافعل أي معالجة يجب عليك القيام به.

تحذيري الوحيد هو أنني لم أفعل ذلك من قبل، لذلك أنا لست متأكدا بنسبة 100٪ أنه سيعمل.

قد يكون البديل الآخر لاستخدام طرق QWebFrame لإدراج كائنات في طراز كائن الصفحة وأيضا أدخل بعض JavaScript الذي يخطر بالفعل كائنك عند اكتمال طلب AJAX. هذه طريقة ثناء قليلا للقيام بذلك، ولكن يجب أن تعمل بالتأكيد.

تعديل:

الخيار الثاني يبدو أفضل بالنسبة لي. سير العمل هو كما يلي:

إرفاق فتحة إلى إشارة QWebFrame :: JavascriptWindowObjectCleared () إشارة. في هذه المرحلة، اتصل QWebFrame :: تقييم JavaVascript () لإضافة رمز مشابه لما يلي: Window.Onload = وظيفة () {// page قام تحميلها بالكامل}

ضع كل الكود الذي تحتاجه في هذه الوظيفة. قد ترغب في إضافة QOBJECT إلى الصفحة عبر QWebFrame :: AddtojavascriptWindowObject () ثم استدعاء وظيفة على هذا الكائن. سيتم تنفيذ هذا الرمز فقط عندما يتم تحميل الصفحة بالكامل.

نأمل أن يجيب هذا السؤال!

نصائح أخرى

عند تشغيل تحميل HTML / Itrames / ITC الأولي، هذا كل شيء. هو - هي يكون تحميل تماما. هذه الحقيقة لا تتغير إذا قررت بعد ذلك استخدام بعض JavaScript للحصول على بعض البيانات الإضافية أو طرق عرض الصفحة أو أي شيء بعد الحقيقة.

ومع ذلك، ما أظن أنك تريد القيام به هنا هو كشف كائن / واجهة QTScript لعرضك أنه يمكنك استدعاء من البرنامج النصي لصفح صفحتك، وتوفير "رد اتصال" بشكل فعال في C ++ بمجرد قررت (من البرنامج النصي الصفحة) أن لديك "تحميل تماما".

آمل أن يساعدك هذا في إعطائك اتجاها لمحاولة ...

للتحقق من تحميل عنصر معين، يمكنك استخدام QTimer. وبعد شيء مثل هذا في بيثون:

@pyqtSlot()
def on_webView_loadFinished(self): 
    self.tObject = QTimer()
    self.tObject.setInterval(1000)
    self.tObject.setSingleShot(True)
    self.tObject.timeout.connect(self.on_tObject_timeout)
    self.tObject.start()

@pyqtSlot()
def on_tObject_timeout(self):
    dElement = self.webView.page().currentFrame().documentElement()
    element  = dElement.findFirst("css selector")
    if element.isNull():
        self.tObject.start()

    else:
        print "Page loaded"

اعتقد المرجع أنه كان بسبب تأخر طلبات أياكس ولكن يمكن أن يكون هناك سبب آخر يشرح أيضا لماذا جدا تأخير الوقت القصير إصلاح المشكلة. هناك خطأ يسبب السلوك الموصوف:

https://bugreports.qt-project.org/browse/qtbug-37377.

لحل هذه المشكلة يجب توصيل إشارة LoadingFinished () باستخدام اتصال قائمة الانتظار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top