[ vs2000 @ 03.04.2011. 12:56 ] @
Imam problem koji se desi kada pokušam da pristupim štampaču u QT-u. Ne uvek, ali možda svaki 10-ti put (otprilike), kada treba da se pokrene štampanje, na redu: 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 |