2013-09-13 2 views
0

У меня есть следующий код:Qt PrintPreviewDialog, при нажатии кнопки «Печать», сбои программы. Почему?

void Test1::on_pushButton_1_clicked() // print the information 
{ 
QPrinter printer(QPrinter::HighResolution); 
printer.setCreator("Me"); 
printer.setDocName("Print"); 
printer.setPaperSize(QPrinter::A4); 

QPrintPreviewDialog *pd = new QPrintPreviewDialog(&printer); 

connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(print(QPrinter*))); 

pd->exec(); 
} 



void Test1::print(QPrinter *p) 
{ 
QPainter painter(p); 
painter.setPen(Qt::blue); 

painter.setRenderHints(QPainter::Antialiasing | 
         QPainter::TextAntialiasing | 
         QPainter::SmoothPixmapTransform, true); 

painter.drawText(100, 100, "Name: "); 
painter.drawText(300, 100, "SuperMan"); 
} 

Она работает в моих экспериментальных проектов, которые с 1 класса [1] диалогового только, но в моем главном проекте, когда я нажимаю кнопку, начинается предварительный просмотр успешно, но затем, когда я нажимаю кнопку «Печать», моя программа просто падает. В нем говорится: «Ваша программа перестала работать, окна будут искать решение» или что-то в этом роде. Мне нужно сказать, что в моей программе много классов и диалогов. Я почти уверен, что проблема с указателями. У меня мало опыта, поэтому я просто не могу найти, где моя ошибка. Пожалуйста, посмотрите мой код и скажите мне, что мне делать, потому что у меня есть еще 2 дня, чтобы закончить этот проект. Спасибо вам большое заблаговременно.

+0

добавить некоторые 'qDebug()' s и посмотреть, где он сбой. или просто запустить в отладчике –

+0

возможный дубликат [QPrinter При нажатии кнопки моя программа вылетает из-за чего?] (http://stackoverflow.com/questions/18752218/qprinter-when-click-button-my-program-crashes-why) – GitaarLAB

ответ

1

Я думаю, что причина в том, что вы создаете объект принтера в стеке

[..] 
QPrinter printer(QPrinter::HighResolution); 
[..] 

и передать указатель на него в диалоговом окне предварительного просмотра печати. Как только диалог запущен с exec(), ваш объект принтера все еще жив, однако при закрытии диалогового окна вы выходите из функции Test1::on_pushButton_1_clicked(), поэтому объект принтера был уничтожен. Дальнейшая ссылка на него приводит к сбою. В качестве решения попробуйте создать свой принтер из кучи, как:

void Test1::on_pushButton_1_clicked() // print the information 
{ 
    // This printer should be deleted later. 
    QPrinter *printer = new QPrinter(QPrinter::HighResolution); 
    printer->setCreator("Me"); 
    printer->setDocName("Print"); 
    printer->setPaperSize(QPrinter::A4); 

    QPrintPreviewDialog *pd = new QPrintPreviewDialog(printer); 
    connect(pd, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*))); 

    pd->exec(); 
} 
+0

vahancho, ваш ответ был лучшим, но он снова рушится, единственное изменение, которое я сделал, - сделать принтер следующим: QPrinter * printer = new QPrinter (QPrinter :: HighResolution); Сначала я объявил его указателем в файле заголовка QPrinter *, а затем просто: printer = new QPrinter (QPrinter :: HighResolution), возможно, я не могу понять вас, что вы хотите от меня сделать. Я не могу удалить указатель из QPrintPreviewDialog, потому что я не могу использовать СИГНАЛЫ. Скажите, пожалуйста, что делать. Если вы хотите скопировать мой код с моего поста и переиздать его.Еще раз спасибо – user2521257

+0

@ user2521257, я изменил свой ответ и включил реализацию, которая, как я думаю, должна решить проблему. Повторите попытку. – vahancho

+0

Vahancho, еще раз спасибо, но это не работает снова. Я пробовал с Release, Debug и Debugger, но у меня снова произошел сбой. С отладчиком я получаю большую ошибку ассемблера со следующим сообщением: «Пониженный остановлен, потому что он получил сигнал от Операционной системы. Имя сигнала:?, Значение сигнала: Неизвестный сигнал« – user2521257

0

Думайте поток этой программы, и вы поймете, почему он не работает.

  1. Вы делаете принтер на стека, а затем подключить сигналы к нему.
  2. Отображается диалоговое окно печати, позволяющее пользователю делать с ней что угодно.
  3. Внешнее событие, например, Напечатано нажатие кнопки, закрытие диалогового окна «Печать» и уничтожение вашего принтера в стеке, поскольку он вышел из сферы действия.
  4. Слот print имеет недопустимое пространство памяти, где раньше была QPrinter* и сбой всей программы.

В Qt большинство из них должно быть выделено на кучу именно по этой причине.

+0

Тайлер, я пробовал все, только все, с кодом ваханчо, с твоими советами, и единственное, что я получаю, это крах. Как я сказал ваханчо, я получаю большую ошибку ассемблера. Это часть его: Функция: RaiseException 0x75a6d35b <+0x0040> ле -0x18 (% EAX),% EDX 0x75a6d35e <+0x0043> ADCB $ 0x8d, 0xcc483ff (% едите,% едите, 8) 0x75a6d366 <+0x004b> вкл% EBP 0x75a6d367 <+0x004c> мы $- x50,% al 0x75a6d369 <+0x004e> звонок * 0x75a6115c 0x75a6d36f <+0x0054> оставить – user2521257

+0

Я предполагаю, что авария в другом месте. –

+0

Тайлер, с кучей, вы имеете в виду начало файла cpp. После включения ?. Пожалуйста, дайте мне пример. Спасибо – user2521257

0

Спасибо всем за ваши ответы, наконец, я решил свою проблему. Так как я ее решил? Я только что изменил режим Release в режим Debug. Tadaaam. Это оно. Файл немного больше, но кому это нужно. Все работает отлично. Большое спасибо за ваши ответы.

Смежные вопросы