Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2022, 13:13   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Как правильно выводить текст на принтер в Qt?

Я работаю с Qt Creator 4.12.2 .
Я написал код для вывода текста на принтер:

Код:
#include <QtPrintSupport/QPrintDialog>
#include <QtPrintSupport/QPrinter>
 
//...
 
void  PrintSolvedNUDialog::on_pushButton_clicked()
// если была нажата кнопка "Печать"
{
    int  len, length, yPos, cyChar, strcount;
    char s[80];
    FILE *f;
 
    QPrinter  printer;
    QPrintDialog  printDialog(&printer,this);
    if (printDialog.exec())
    {
        QPainter  painter(&printer);
        strcount = 0;
        cyChar = 10;
        yPos = 0;
        f = fopen("result.txt","rt");
        while (!feof(f))
        {
            fgets(s,256,f);
            if (strcount==2)
                painter.drawText(500,yPos,QString(s));
            else
                painter.drawText(320,yPos,QString(s));
            yPos += cyChar;
            strcount++;
        }
        fclose(f);
    }
}
И при сборке (компиляции) на строках

Код:
QPrinter  printer;
QPrintDialog  printDialog(&printer,this);
if (printDialog.exec());
у меня появляются сообщения об ошибке:

Цитата:
undefined reference to `_imp__ZN8QPrinterC1ENS_11PrinterMo deE'
undefined reference to `_imp__ZN12QPrintDialogC1EP8QPrinte rP7QWidget'
undefined reference to `_imp__ZN12QPrintDialog4execEv'
undefined reference to `_imp__ZN12QPrintDialogD1Ev'
undefined reference to `_imp__ZN8QPrinterD1Ev'
undefined reference to `_imp__ZN12QPrintDialogD1Ev'
undefined reference to `_imp__ZN8QPrinterD1Ev'
collect2.exe: error: Id returned 1 exit status
В чём причина этих ошибок? Как их исправить?
И вообще, у меня правильный код?
erslgoeirjh вне форума Ответить с цитированием
Старый 09.11.2022, 14:07   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Не добавили либу
QT += printsupport
p51x вне форума Ответить с цитированием
Старый 10.11.2022, 09:06   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Ясно. И ещё вопрос: как сделать переход на новую страницу при печати? (То есть как сделать печать файла на несколько страниц?)
erslgoeirjh вне форума Ответить с цитированием
Старый 10.11.2022, 09:17   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

QPrinter::newPage()
p51x вне форума Ответить с цитированием
Старый 14.11.2022, 12:35   #5
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Я написал код для вывода текста на печать:

Код:
void  PrintSolvedNUDIalog::on_pushButton_clicked()
// если была нажата кнопка "Печать"
{
    int  i, len, length, yPos, cyChar, strcount;
    char  s[80], sprev[80], s2[80];
    QString  myString;
    FILE *f;
    
    QPrinter  printer;
    QPrintDialog  printDialog(&printer,this);
    if (printDialog.exec())
    {
        QPainter  painter(&printer);
        strcount = 0;
        cyChar = 10;
        yPos = 0;
        strcpy(sprev,"");
        f = fopen("results.txt","rt");
        if (f!=NULL)
        {
            for (i=0; i<3; i++) // отладочный вариант--вывод трёх строк
            {
                fgets(s,256,f);
                myString = QString(s);
                length = myString.length();
                myString = myString.left(length-1); // убираем последний символ '\n' в строке
                if (strcount==2)
                    painter.drawText(200,yPos,myString);
                else
                    painter.drawText(20,yPos,myString);
                yPos += yChar;
                strcpy(sprev,s);
            }
            fclose(f);
        }
    }
}
И на строке
Код:
fclose(f);
программа бьётся--выводится сообщение:

Цитата:
Получен сигнал - Qt Creator

Приложение остановлено, так как оно получило сигнал от операционной системы.
Сигнал: SIGSEGV
Назначение: Segmentation fault
В чём причина этого? Как исправить эту ошибку?
erslgoeirjh вне форума Ответить с цитированием
Старый 14.11.2022, 20:28   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
В чём причина этого?
Запустите код в отладчике, обычно отладчик останавливается на строке где происходит проблема.
Но навскидку, проблема вот: fgets(s,256,f) и char s[80]. Чуствуете разницу между 80 и 256?
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как надо правильно выводить в два столбца? korn999 C++ Builder 4 21.12.2014 18:11
Я не понимаю как нужно правильно выводить строчку матрицы на экран (как это написать)? Julia1 Паскаль, Turbo Pascal, PascalABC.NET 1 08.02.2014 16:33
Выводить текст по координатам O m n i s HTML и CSS 6 12.07.2013 14:06
Как правильно выводить текст на канву HellMercenariess Общие вопросы Delphi 1 12.06.2012 07:37
как заставить label выводить текст сразу? zAlexandrz Общие вопросы Delphi 2 23.11.2007 18:39