QPrinter printer(QPrinter::HighResolution);
Dođe do greške - Segmentation fault.
Nisam uspeo da zapazim nikakvo pravilo da se to dešava zbog nekog oređenog razloga. Jednostavno se nekada desi, a u većini slučajeva prođe bez problema.
Problem je u tome što program treba da prikuplja podatke jako dugo vremena (oko 12 sati), a zatim da to odštampa. Ako bi se desilo da se program neočiekivano završi na ovom delu svi podaci bi ostali izgubljeni, korisnih bi bio strašno ljut i mogao bi da postane jako opasan, naročito po mene.

Nije šala... U nekom drugom slučaju ovo ne bi bilo baš toliko strašno, ali u ovom jeste. Problem je što je ovo moj prvi program u QT-u, i što imam svega 2 nedelje iskustva sa njim. Pokušao sam da napišem maksimalno pedantno čitav program, ali ovaj problem preti da to sve pokvari.
Drugo pitanje: ima li u QT4 neki način da se nasatavi sa izvršenjem programa ako dođe do ozbiljnog problema, da se preduzme neka radnja predviđena za slučaj greške? Nisam uspeo da nađem odgovor na to. U ovom slučaju ako bi se greška pojavila bih zamoliio korisnika da sačeka trenutak i da ponovo pokuša štampanje, ovako se program samo završi na jako loš način, i podaci nestanu.
try{} catch{} ne funkcioniše, koliko sam shvatio.
Kôd izgleda otprilike ovako:
Code:
void MainWindowImpl::on_action_Stampanje_dijagrama_triggered() //Meni „Štampanje" stavka „Štampanje dijagrama"
{
//Kôd za štampanje dijagrama
QPrinter printer(QPrinter::HighResolution);
printer.setOrientation(QPrinter::Landscape);
printer.setPaperSize(QPrinter::A4);
printer.setOutputFormat(QPrinter::PdfFormat);
/////printer.setCreator("Moje programče");
//napraviti fajlić sa vremenom početka merenja u nazivu
printer.setOutputFileName("/home/vladimir/"+datumPocetkaMerenja.toString("dd-MM-yyyy hh-mm-ss")+".pdf");
QPainter painter;
if (! painter.begin(&printer))
{ //Nije mogao biti otvoren fajlić za upisivanje
qWarning("Nije uspelo upisivanje u fajl. Moguće da je trenutno samo za čitanje");
return;
}
//painter.begin(&printer);
painter.setFont(QFont("Arial", 8));
painter.setRenderHint(QPainter::Antialiasing, true);
QString strTemp;
strTemp=QString::fromUtf8("NEKI TEKST: ")+lineEditVrstaMaterijala->text();
painter.drawText(300,200,strTemp);
strTemp=QString::fromUtf8("JOŠ TEKSTA: ")+lineEditKolicinaMaterijala->text();
painter.drawText(300,360,strTemp); ///... itd... itd...
......
if(!datumZavrsetkaMerenja.isNull()) //Ako je datum završetka merenja postavljen (pritiskom na STOP
{ //prikazati i njega, inače ne prikazivati ga
strTemp="JOŠ, JOŠ TEKSTA...: "+datumPocetkaMerenja.toString("dd.MM.yyyy hh:mm:ss")
+ " - " + datumZavrsetkaMerenja.toString("dd.MM.yyyy hh:mm:ss");
}
else
{
strTemp="......: "+datumPocetkaMerenja.toString("dd.MM.yyyy hh:mm:ss")
+ " - ";
}
painter.drawText(300,840,strTemp);
//Štampanje dijagrama
////QwtPlot *dijagram=new QwtPlot;
////QwtPlotGrid *mreza = new QwtPlotGrid; //crtanje mreže u dijagramu
////QwtPlotCurve *referentna_kriva= new QwtPlotCurve("ref."); //Kriva za referentrnu "crtu"
QwtPlot dijagram;
QwtPlotGrid mreza;
QwtPlotCurve referentna_kriva;
referentna_kriva.setPen(QPen(Qt::red));
referentna_kriva.setTitle("ref.temp");
//referentna_kriva->setPen(QPen(Qt::red)); //boja referentrne crte
double x_ref[2]; //dve duble promenjive za dve kordinate na početku i na kraju
double y_ref[2];
... itd... itd....
dijagram.setCanvasBackground(QColor(255,255,255));
//font za dijagram
QFont font;
font.setFamily("Helvetica [Cronyx]");
font.setWeight(QFont::Light);
font.setPointSize(8);
dijagram.setAxisFont(QwtPlot::xBottom,font);
dijagram.setAxisFont(QwtPlot::yLeft,font);
//legenda
QwtLegend legenda;
legenda.setFrameStyle(QFrame::Box|QFrame::Sunken);
//legenda.setItemMode(QwtLegend::ClickableItem);
///legenda.setFont(font);
dijagram.insertLegend(&legenda, QwtPlot::BottomLegend);
dijagram.replot(); //primenjivanje svih gornjih podešavanja na dijagram
QwtPlotRenderer renderer;
renderer.setDiscardFlag(QwtPlotRenderer::DiscardCanvasBackground);
//renderer.setLayoutFlag(QwtPlotRenderer::FrameWithScales);
const QSize sz(12250, 7000); //postavljanje dimenzija dijagrama
//crtanje dijagrama određenih dimenzija i na određenoj poziciji
renderer.render(&dijagram, &painter, QRectF( QPointF(300, 1200), sz));
painter.end();
} //Kraj funkcije za štampanje dijagrama
void MainWindowImpl::on_action_Stampanje_dijagrama_triggered() //Meni „Štampanje" stavka „Štampanje dijagrama"
{
//Kôd za štampanje dijagrama
QPrinter printer(QPrinter::HighResolution);
printer.setOrientation(QPrinter::Landscape);
printer.setPaperSize(QPrinter::A4);
printer.setOutputFormat(QPrinter::PdfFormat);
/////printer.setCreator("Moje programče");
//napraviti fajlić sa vremenom početka merenja u nazivu
printer.setOutputFileName("/home/vladimir/"+datumPocetkaMerenja.toString("dd-MM-yyyy hh-mm-ss")+".pdf");
QPainter painter;
if (! painter.begin(&printer))
{ //Nije mogao biti otvoren fajlić za upisivanje
qWarning("Nije uspelo upisivanje u fajl. Moguće da je trenutno samo za čitanje");
return;
}
//painter.begin(&printer);
painter.setFont(QFont("Arial", 8));
painter.setRenderHint(QPainter::Antialiasing, true);
QString strTemp;
strTemp=QString::fromUtf8("NEKI TEKST: ")+lineEditVrstaMaterijala->text();
painter.drawText(300,200,strTemp);
strTemp=QString::fromUtf8("JOŠ TEKSTA: ")+lineEditKolicinaMaterijala->text();
painter.drawText(300,360,strTemp); ///... itd... itd...
......
if(!datumZavrsetkaMerenja.isNull()) //Ako je datum završetka merenja postavljen (pritiskom na STOP
{ //prikazati i njega, inače ne prikazivati ga
strTemp="JOŠ, JOŠ TEKSTA...: "+datumPocetkaMerenja.toString("dd.MM.yyyy hh:mm:ss")
+ " - " + datumZavrsetkaMerenja.toString("dd.MM.yyyy hh:mm:ss");
}
else
{
strTemp="......: "+datumPocetkaMerenja.toString("dd.MM.yyyy hh:mm:ss")
+ " - ";
}
painter.drawText(300,840,strTemp);
//Štampanje dijagrama
////QwtPlot *dijagram=new QwtPlot;
////QwtPlotGrid *mreza = new QwtPlotGrid; //crtanje mreže u dijagramu
////QwtPlotCurve *referentna_kriva= new QwtPlotCurve("ref."); //Kriva za referentrnu "crtu"
QwtPlot dijagram;
QwtPlotGrid mreza;
QwtPlotCurve referentna_kriva;
referentna_kriva.setPen(QPen(Qt::red));
referentna_kriva.setTitle("ref.temp");
//referentna_kriva->setPen(QPen(Qt::red)); //boja referentrne crte
double x_ref[2]; //dve duble promenjive za dve kordinate na početku i na kraju
double y_ref[2];
... itd... itd....
dijagram.setCanvasBackground(QColor(255,255,255));
//font za dijagram
QFont font;
font.setFamily("Helvetica [Cronyx]");
font.setWeight(QFont::Light);
font.setPointSize(8);
dijagram.setAxisFont(QwtPlot::xBottom,font);
dijagram.setAxisFont(QwtPlot::yLeft,font);
//legenda
QwtLegend legenda;
legenda.setFrameStyle(QFrame::Box|QFrame::Sunken);
//legenda.setItemMode(QwtLegend::ClickableItem);
///legenda.setFont(font);
dijagram.insertLegend(&legenda, QwtPlot::BottomLegend);
dijagram.replot(); //primenjivanje svih gornjih podešavanja na dijagram
QwtPlotRenderer renderer;
renderer.setDiscardFlag(QwtPlotRenderer::DiscardCanvasBackground);
//renderer.setLayoutFlag(QwtPlotRenderer::FrameWithScales);
const QSize sz(12250, 7000); //postavljanje dimenzija dijagrama
//crtanje dijagrama određenih dimenzija i na određenoj poziciji
renderer.render(&dijagram, &painter, QRectF( QPointF(300, 1200), sz));
painter.end();
} //Kraj funkcije za štampanje dijagrama