Название: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Декабрь 08, 2008, 13:47
Столкнулся с багом при печати документа из QWebView. Прошу проверить, это только у меня так или у всех. Описываю, что надо делать. 1) Скачать проект из аттача 2) Собрать, запустить и нажать кнопку Печать (она там одна) 3) Выбрать печать в файл (галку поставить) 4) Появится окно с запросом именем файла - тут нажать Отмену !! У меня после этого валится. Прилагаю код: C++ (Qt) Window::Window() { view_ = new QWebView(this); setCentralWidget(view_); QPushButton *pb = new QPushButton("Print", this); connect(pb, SIGNAL(clicked()), this, SLOT(print())); view_->setHtml("<center><h1>PRINT</h1></center>"); } void Window::print() { QPrinter *printer = new QPrinter(); printer->setResolution(QPrinter::HighResolution); printer->setFullPage(true); printer->setPageMargins(2.0, 10.0, 2.0, 10.0, QPrinter::Millimeter); QPrintDialog *dlg = new QPrintDialog(printer, this); dlg->setWindowTitle(tr("Print Document")); if (dlg->exec() == QDialog::Accepted) { view_->print(printer); } delete printer; delete dlg; }
C++ (Qt) class Window : public QMainWindow { Q_OBJECT public: Window(); QWebView *view_; public slots: void print(); };
P.S. геши не понимает русских букв?
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: Rcus от Декабрь 08, 2008, 14:10
Порядок удаления объектов должен быть обратным к порядку создания (lifo), а у вас printer удаляется до dlg. Может быть поэтому валится?
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: Racheengel от Декабрь 08, 2008, 14:35
QPrintDialog *dlg = new QPrintDialog(printer, this);
Поскольку передается this... то Window становится пэрентом диалога. А потом - некорректное удаление. Думаю, надо this опустить :)
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 08, 2008, 14:39
Поскольку передается this... то Window становится пэрентом диалога. А потом - некорректное удаление. Думаю, надо this опустить :)
Нет, проблема точно не в этом. Qt разруливает такую ситуацию (см. QObject::destroyed или QObjectCleanupHandler). 2 kirill: А делится то? Покажи нам стек
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: Racheengel от Декабрь 08, 2008, 14:50
Нет, проблема точно не в этом. Qt разруливает такую ситуацию (см. QObject::destroyed или QObjectCleanupHandler).
Не могу сейчас дебагером проверить, но сам лично сталкивался с подобным - delete падал, если был задан пэрент в конструкторе. 4.4.3 вообще мегабажный релиз, может регрессия вкралась.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Декабрь 08, 2008, 14:51
Блин ну я же просил скачать проект и посмотреть. Удаление тут ни при чем абсолютно. Убрал и this - результат тот же. Еще раз - скачайте проект и посмотрите. Стек вызовов QtGuid4.dll!QFlags<enum QPaintEngine::PaintEngineFeature>::operator&(int mask=256) Line 1928 + 0x16 bytes C++ QtGuid4.dll!QPaintEngine::hasFeature(QFlags<enum QPaintEngine::PaintEngineFeature> feature={...}) Line 219 + 0x21 bytes C++ QtWebKitd4.dll!WebCore::GraphicsContext::setCompositeOperation(WebCore::CompositeOperator op=CompositeCopy) Line 776 + 0x28 bytes C++ QtWebKitd4.dll!WebCore::RenderBox::paintBackgroundExtended(WebCore::GraphicsContext * context=0x0012bb98, const WebCore::Color & c={...}, const WebCore::BackgroundLayer * bgLayer=0x00d9449c, int clipY=0, int clipH=583, int tx=0, int ty=0, int w=992, int h=600, bool includeLeftEdge=true, bool includeRightEdge=true) Line 670 C++ QtWebKitd4.dll!WebCore::RenderBox::paintBackground(WebCore::GraphicsContext * context=0x0012bb98, const WebCore::Color & c={...}, const WebCore::BackgroundLayer * bgLayer=0x00d9449c, int clipY=0, int clipH=583, int tx=0, int ty=0, int width=992, int height=600) Line 409 C++ QtWebKitd4.dll!WebCore::RenderBox::paintBackgrounds(WebCore::GraphicsContext * context=0x0012bb98, const WebCore::Color & c={...}, const WebCore::BackgroundLayer * bgLayer=0x00d9449c, int clipY=0, int clipH=583, int tx=0, int ty=0, int width=992, int height=600) Line 403 C++ QtWebKitd4.dll!WebCore::RenderBox::paintRootBoxDecorations(WebCore::RenderObject::PaintInfo & paintInfo={...}, int tx=0, int ty=0) Line 344 C++ QtWebKitd4.dll!WebCore::RenderBox::paintBoxDecorations(WebCore::RenderObject::PaintInfo & paintInfo={...}, int tx=0, int ty=0) Line 355 C++ QtWebKitd4.dll!WebCore::RenderBlock::paintObject(WebCore::RenderObject::PaintInfo & paintInfo={...}, int tx=0, int ty=0) Line 1554 C++ QtWebKitd4.dll!WebCore::RenderBlock::paint(WebCore::RenderObject::PaintInfo & paintInfo={...}, int tx=0, int ty=0) Line 1401 C++ QtWebKitd4.dll!WebCore::RenderLayer::paintLayer(WebCore::RenderLayer * rootLayer=0x00d934e4, WebCore::GraphicsContext * p=0x0012bb98, const WebCore::IntRect & paintDirtyRect={...}, bool haveTransparency=false, WebCore::PaintRestriction paintRestriction=PaintRestrictionNone, WebCore::RenderObject * paintingRoot=0x00000000) Line 1473 C++ QtWebKitd4.dll!WebCore::RenderLayer::paintLayer(WebCore::RenderLayer * rootLayer=0x00d934e4, WebCore::GraphicsContext * p=0x0012bb98, const WebCore::IntRect & paintDirtyRect={...}, bool haveTransparency=false, WebCore::PaintRestriction paintRestriction=PaintRestrictionNone, WebCore::RenderObject * paintingRoot=0x00000000) Line 1525 + 0x25 bytes C++ QtWebKitd4.dll!WebCore::RenderLayer::paint(WebCore::GraphicsContext * p=0x0012bb98, const WebCore::IntRect & damageRect={...}, WebCore::PaintRestriction paintRestriction=PaintRestrictionNone, WebCore::RenderObject * paintingRoot=0x00000000) Line 1393 C++ QtWebKitd4.dll!WebCore::Frame::paint(WebCore::GraphicsContext * p=0x0012bb98, const WebCore::IntRect & rect={...}) Line 1362 C++ QtWebKitd4.dll!WebCore::PrintContext::spoolPage(WebCore::GraphicsContext & ctx={...}, int pageNumber=0, float width=793.00000) Line 128 C++ QtWebKitd4.dll!QWebFrame::print(QPrinter * printer=0x00e234a8) Line 785 C++ QtWebKitd4.dll!QWebView::print(QPrinter * printer=0x00e234a8) Line 570 C++ PrintWebView.exe!Window::print() Line 32 C++ PrintWebView.exe!Window::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=0, void * * _a=0x0012bd5c) Line 67 C++ QtCored4.dll!QMetaObject::activate(QObject * sender=0x00d37168, int from_signal_index=29, int to_signal_index=30, void * * argv=0x0012bd5c) Line 3022 + 0x2b bytes C++ QtCored4.dll!QMetaObject::activate(QObject * sender=0x00d37168, const QMetaObject * m=0x65899d74, int from_local_signal_index=2, int to_local_signal_index=3, void * * argv=0x0012bd5c) Line 3112 + 0x15 bytes C++ QtGuid4.dll!QAbstractButton::clicked(bool _t1=false) Line 185 + 0x17 bytes C++ QtGuid4.dll!QAbstractButtonPrivate::emitClicked() Line 540 C++ QtGuid4.dll!QAbstractButtonPrivate::click() Line 532 C++ QtGuid4.dll!QAbstractButton::mouseReleaseEvent(QMouseEvent * e=0x0012c448) Line 1111 C++ QtGuid4.dll!QWidget::event(QEvent * event=0x0012c448) Line 7164 C++ QtGuid4.dll!QAbstractButton::event(QEvent * e=0x0012c448) Line 1073 C++ QtGuid4.dll!QPushButton::event(QEvent * e=0x0012c448) Line 653 C++ QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver=0x00d37168, QEvent * e=0x0012c448) Line 3803 + 0x11 bytes C++ QtGuid4.dll!QApplication::notify(QObject * receiver=0x00d37168, QEvent * e=0x0012c448) Line 3528 + 0x2f bytes C++ QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver=0x00d37168, QEvent * event=0x0012c448) Line 587 + 0x15 bytes C++ QtCored4.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver=0x00d37168, QEvent * event=0x0012c448) Line 212 + 0x38 bytes C++ QtGuid4.dll!QApplicationPrivate::sendMouseEvent(QWidget * receiver=0x00d37168, QMouseEvent * event=0x0012c448, QWidget * alienWidget=0x00d37168, QWidget * nativeWidget=0x0012feac, QWidget * * buttonDown=0x65a7c74c, QPointer<QWidget> & lastMouseReceiver={...}) Line 2793 + 0xe bytes C++ QtGuid4.dll!QETWidget::translateMouseEvent(const tagMSG & msg={...}) Line 3085 + 0x28 bytes C++ QtGuid4.dll!QtWndProc(HWND__ * hwnd=0x000e0c52, unsigned int message=514, unsigned int wParam=0, long lParam=1441861) Line 1543 + 0xc bytes C++ user32.dll!77d48709()
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!77d487eb()
user32.dll!77d70494()
user32.dll!77d489a5()
user32.dll!77d70494()
user32.dll!77d489e8()
QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 737 + 0x21 bytes C++ QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 1084 + 0x15 bytes C++ QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 144 C++ QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 194 + 0x1c bytes C++ QtCored4.dll!QCoreApplication::exec() Line 845 + 0x15 bytes C++ QtGuid4.dll!QApplication::exec() Line 3332 C++ PrintWebView.exe!main(int argc=1, char * * argv=0x003f8ee0) Line 18 + 0xc bytes C++ PrintWebView.exe!WinMain(HINSTANCE__ * instance=0x00400000, HINSTANCE__ * prevInstance=0x00000000, char * __formal=0x00151f0e, int cmdShow=1) Line 134 + 0x12 bytes C++ PrintWebView.exe!__tmainCRTStartup() Line 578 + 0x35 bytes C PrintWebView.exe!WinMainCRTStartup() Line 403 C kernel32.dll!7c816d4f()
kernel32.dll!7c8399f3()
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 08, 2008, 15:40
Не могу сейчас дебагером проверить, но сам лично сталкивался с подобным - delete падал, если был задан пэрент в конструкторе.
Возможно ты наткнулся на грабли с аттрибутом Qt::WA_DeleteOnClose. Т.е. Qt удалила объект + ты потом сам попытался его удалить, при помощи delete ну или ты пытался удалить ранее удаленные объект.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 08, 2008, 15:47
Да, у меня тоже воспроизвелось это. До удаления принтера и диалога дело недошло. На консоль получил вот это: QWin32PrintEngine::begin: StartDoc failed (Операция была отменена пользователем.) QWin32PrintEngine::begin: StartPage failed (Неверный дескриптор.) QPainter::begin(): Returned false QPainter::setWorldTransform: Painter not active QPainter::renderHints: Painter must be active to set rendering hints QPainter::setRenderHint: Painter must be active to set rendering hints QPainter::save: Painter not active QPainter::setWorldTransform: Painter not active QPainter::setWorldTransform: Painter not active QPainter::clipRegion: Painter not active QPainter::save: Painter not active имхо, это баг в QWebFrame::print (строка 771) при создании QPainter. Пиши репорт или могу написть его я.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: Racheengel от Декабрь 08, 2008, 16:02
Painter not active
Помнишь, такое же, в табле? :)))
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 08, 2008, 16:04
Помнишь, такое же, в табле? :)))
Как такое можно забыть ;)))
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Декабрь 08, 2008, 16:35
Напиши пожалуйста, а то я по английски как собака, все понимаю, а сказать не могу.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 08, 2008, 17:34
Отправил, ждем ответа. А пока можешь сам пофиксить этот баг. Открываем QTDIR\src\3rdparty\webkit\WebKit\qt\Api\qwebframe.cpp, ln. 771: C++ (Qt) QPainter painter(printer);
заменить на C++ (Qt) QPainter painter(printer); if (!painter.isActive()) { printContext.end(); return; }
и пересобрать WebKit.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Декабрь 09, 2008, 08:59
ОК будем ждать исправлений.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 09, 2008, 12:20
Если для тебя это критично, то подсправь сам код и создай патч (если прога твоя распространяется). Я на процентов 98% уверен, что они так и пофиксят эту проблему.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Декабрь 09, 2008, 12:56
Все несколько сложнее. Я пишу под виндой, потом отдаю линуксоидам и они делают линуксовую сборку из исходников. Так что и им придется пересобирать webkit, что они делать вряд ли захотят. Обошел проблему через try{} catch()
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Декабрь 11, 2008, 20:52
Наконец Троли расчихлились: I can reproduce this problem here and I have created a task for the development team who will look into fixing this for a future release. You can track this issue in the Task Tracker with ID 238391
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: ритт от Январь 29, 2009, 11:08
20090128 * [238391] Prevented crash when printing to file is cancelled.
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: pastor от Январь 29, 2009, 11:59
238391 - Application crashes when cancelling printing a QWebView to file - Windows
Resolution: Fixed Scheduled for: 4.5.0 (Next Minor Release) kirill, качай свеженький снапшот и проверяй ;)
Название: Re: QWebView и отмена печати (прошу проверить поведение)
Отправлено: kirill от Январь 29, 2009, 12:09
Да я не качаю снапшоты. Только релизы. Такова политика компании. Впрочем, я не думаю, что такой баг требует особенной проверки.
|