Russian Qt Forum
Ноябрь 22, 2024, 16:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QWebView и отмена печати (прошу проверить поведение)  (Прочитано 16701 раз)
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. геши не понимает русских букв?
Записан
Rcus
Гость
« Ответ #1 : Декабрь 08, 2008, 14:10 »

Порядок удаления объектов должен быть обратным к порядку создания (lifo), а у вас printer удаляется до dlg. Может быть поэтому валится?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Декабрь 08, 2008, 14:35 »

QPrintDialog *dlg = new QPrintDialog(printer, this);

Поскольку передается this... то Window становится пэрентом диалога.
А потом - некорректное удаление.
Думаю, надо this опустить Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Декабрь 08, 2008, 14:39 »

Поскольку передается this... то Window становится пэрентом диалога.
А потом - некорректное удаление.
Думаю, надо this опустить Улыбающийся

Нет, проблема точно не в этом. Qt разруливает такую ситуацию (см. QObject::destroyed или QObjectCleanupHandler).

2  kirill: А делится то? Покажи нам стек
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Декабрь 08, 2008, 14:50 »

Нет, проблема точно не в этом. Qt разруливает такую ситуацию (см. QObject::destroyed или QObjectCleanupHandler).

Не могу сейчас дебагером проверить, но сам лично сталкивался с подобным - delete падал, если был задан пэрент в конструкторе.
4.4.3 вообще мегабажный релиз, может регрессия вкралась.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kirill
Гость
« Ответ #5 : Декабрь 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()


Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Декабрь 08, 2008, 15:40 »

Не могу сейчас дебагером проверить, но сам лично сталкивался с подобным - delete падал, если был задан пэрент в конструкторе.

Возможно ты наткнулся на грабли с аттрибутом Qt::WA_DeleteOnClose. Т.е. Qt удалила объект + ты потом сам попытался его удалить, при помощи delete ну или ты пытался удалить ранее удаленные объект.
« Последнее редактирование: Декабрь 08, 2008, 15:43 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Декабрь 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. Пиши репорт или могу написть его я.
« Последнее редактирование: Декабрь 08, 2008, 15:57 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Декабрь 08, 2008, 16:02 »

Painter not active

Помнишь, такое же, в табле? Улыбающийся))
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Декабрь 08, 2008, 16:04 »

Помнишь, такое же, в табле? Улыбающийся))

Как такое можно забыть Подмигивающий))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kirill
Гость
« Ответ #10 : Декабрь 08, 2008, 16:35 »

Напиши пожалуйста, а то я по английски как собака, все понимаю, а сказать не могу.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Декабрь 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.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kirill
Гость
« Ответ #12 : Декабрь 09, 2008, 08:59 »

ОК будем ждать исправлений.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Декабрь 09, 2008, 12:20 »

Если для тебя это критично, то подсправь сам код и создай патч (если прога твоя распространяется). Я на процентов 98% уверен, что они так и пофиксят эту проблему.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kirill
Гость
« Ответ #14 : Декабрь 09, 2008, 12:56 »

Все несколько сложнее.
Я пишу под виндой, потом отдаю линуксоидам и они делают линуксовую сборку из исходников. Так что и им придется пересобирать webkit, что они делать вряд ли захотят.
Обошел проблему через try{} catch()
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.29 секунд. Запросов: 23.