[knowhow thread]qt-Fragen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

[knowhow thread]qt-Fragen

Beitrag von mampfi » 02.09.2015 15:08:32

Momentan baue ich mir meine Adressverwaltung (mysql, debian linux), die ich schon unter php habe auf qt um

Nun würde ich ganz gerne einen Datensatz für meinen Ordner ausdrucken.

Was wäre denn der Vorschlag für eine möglichst einfache Lösung.


Das Internet präsentiert einem die verschiedensten Ansätze.
Zuletzt geändert von mampfi am 20.09.2015 15:36:37, insgesamt 3-mal geändert.
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: qt drucken einfache lösung

Beitrag von eggy » 02.09.2015 19:12:40

Da gibts viele unterschiedliche Ansätze, ich mags einfach nen PDF zu erstellen.
Hast Du Dir mal den Code in Examples/Qt-5.5/widgets/richtext/textedit/textedit.cpp angesehn?

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: qt drucken einfache lösung

Beitrag von mampfi » 03.09.2015 10:42:06

Examples in der qt-Installation oder online?


"Eigentlich" geht es ja um das Ausdrucken eines gefundenen Datensatzes, für einen Adressordner bzw. eines kleinen Zettelchens mit den wichtigsten Nummern.
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: qt drucken einfache lösung

Beitrag von eggy » 03.09.2015 14:14:35

Eigentlich in der Installation (ins entsprechende Verzeichnis gehen: qmake && make && ./textedit), den Code gibts aber auch online
http://doc.qt.io/qt-5/qtwidgets-richtex ... t-cpp.html

Im Minialfall läufts in etwa auf folgendes hinaus, aber schau Dir das Beispiel und die Doku zu QPrinter an.

Code: Alles auswählen

QT += printsupport

#include <QtPrintSupport/QPrinter>"
#include <QPainter>

QPrinter printer;
QPainter painter;
painter.begin(&printer);
painter.drawText(10, 10, "Test");
painter.end();


mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: qt drucken einfache lösung

Beitrag von mampfi » 04.09.2015 13:11:59

In diesen Fällen träume ich wieder von alten Zeiten als man ördinär Writeln(LST, "8000 München 90") oder Lprint("8000 München 90") schrieb ;-)

Kommt das "QT += printsupport" zu den Deklarationen in den Quellcode oder in die pro-Datei?
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: qt drucken einfache lösung

Beitrag von eggy » 04.09.2015 13:18:21

in die pro

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: qt drucken einfache lösung

Beitrag von mampfi » 04.09.2015 13:26:46

Danke

erschwerend kommt noch hinzu, dass auf dem "Entwicklungsrechner" notebook kein Drucker installiert ist, aber der wird dann ja wohl in eine print.pdf "drucken".

Und das Kompilat läuft ja auf dem "Druckerrechner".

Probier ich aus und melde mich.
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: qt drucken einfache lösung

Beitrag von eggy » 04.09.2015 13:53:41

Code: Alles auswählen

QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("/tmp/test.pdf");
mehr dazu in der Doku unter QPrinter

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: qt drucken einfache lösung

Beitrag von mampfi » 04.09.2015 14:18:14

Spitze, hat such geklappt.

Bei #include <QtPrintSupport/QPrinter> kam Fehlermeldung


#include <QPrinter> hat funktioniert
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: qt drucken einfache lösung

Beitrag von mampfi » 05.09.2015 13:25:09

Problem stand auch in http://www.qtforum.de/forum/viewtopic.p ... 592#p79592


Nochmals Dank, anbei gleich mal das Ausdrucken des Datensatzes:
  • void MainWindow::sub_drucke_datensatz()

    {
    QPrinter printer;
    QPainter painter;
    int x, y, delta_y, fontsize;
    QString drucken_in_pdf;

    qDebug()<< "Hier ist Druckedatensatz" << "--";

    drucken_in_pdf = "1";

    if (drucken_in_pdf == "1")
    {
    QMessageBox::information(this, "Info", "Drucke in pdf-Datei");
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("adr_datensatz.pdf");
    }

    x=10; y=0; delta_y=20; fontsize=15;
    painter.begin(&printer);

    painter.setFont(QFont("Arial", fontsize, QFont::Normal));

    painter.drawText(x, y+=delta_y, firma);
    painter.drawText(x, y+=delta_y, vorname+" "+nachname);
    painter.drawText(x, y+=delta_y, plz+" "+ort);
    painter.drawText(x, y+=delta_y, strasse);
    painter.drawText(x, y+=delta_y*2, "Telefon: "+telefon+" | "+telefon_2);
    painter.drawText(x, y+=delta_y, "Fax: "+fax);
    painter.drawText(x, y+=delta_y*2, "E-Mail: "+email+" | "+email_2);
    painter.drawText(x, y+=delta_y, "Website: "+website);
    painter.drawText(x, y+=delta_y*2, "Geburtstag: "+geburtstag);
    painter.drawText(x, y+=delta_y, "Bemerkung: "+bemerkung);
    painter.drawText(x, y+=delta_y*2, "Zusatzfelder: "+zusatzfeld_1+"|"+zusatzfeld_2);
    painter.drawText(x, y+=delta_y, "Nickname: "+nickname);

    painter.end();

    QMessageBox::information(this, "Info", "Drucken abgeschlossen");
    }
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [gelöst]qt drucken einfache lösung

Beitrag von eggy » 05.09.2015 13:33:27

Die nötigen Abstände lassen sich übrigens recht einfach mit QFontmetrics berechnen.
http://doc.qt.io/qt-5/qfontmetrics.html#details

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [gelöst]qt drucken einfache lösung

Beitrag von mampfi » 08.09.2015 13:12:34

Die Leutz, die dieses Anleitung geschrieben haben, habens leider nicht so mit Beispielen.

Mein nächstes Problem konnte ich leider nicht recherchieren:

Beim Erreichen der Seite unten bräuchte ich einen neue (leere) Seite.
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [gelöst]qt drucken einfache lösung

Beitrag von eggy » 08.09.2015 13:59:42

http://doc.qt.io/qt-5/qprinter.html#newPage

Mein Ansatz wäre:
Ausrechnen wieviele Zeilen bei dem verwendeten Font auf eine Seite passen
Mitzählen wieviele Zeilen Du schon ausgegeben hast,
zu gegebener Zeit (zeilen%maxzeilen) newpage()

Wahrscheinlich gehts aber auch irgendwie einfacher, in den Beispielen gibts bestimmt was "Fertiges". Das Beispiel oben bekommts ja auch ohne newpage hin.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [gelöst]qt drucken einfache lösung

Beitrag von mampfi » 08.09.2015 14:18:40

Das Beispiel ist das Drucken eines Datensatzes.

Jetzt habe ich aber auch meine php-Routine fürs Telefon-Zettelchen-Drucken in qt neu verfasst ;-)

(Hat ein Feld Prio, bei prio=5 lässt er alle raus)

Ah, doch newpage. (Muss ich mich vertippt haben *duck*)

  • Auschnitt:

    while ( sqlBefehl.next())
    {
    sub_fuelle_variablen();

    QString Trenner="|";

    painter.drawText(x, y+=delta_y, firma + Trenner + vorname + Trenner + nachname+ Trenner + plz + Trenner + ort + Trenner + strasse + Trenner + telefon + Trenner + telefon_2 + Trenner + email + Trenner + bemerkung + Trenner + zusatzfeld_1 + Trenner + zusatzfeld_2);

    //painter.drawText(x, y+=delta_y, ">>"+firma + Trenner + vorname + Trenner + nachname+ Trenner + plz + Trenner + ort + Trenner + strasse + Trenner + telefon + Trenner + telefon_2 + Trenner + email + Trenner);
    //painter.drawText(x, y+=delta_y, "--" + bemerkung + zusatzfeld_1 + Trenner + zusatzfeld_2);
    }

    QMessageBox::information(this, "Info", "Drucken der Liste abgeschlossen, verwendete prio <= "+prio_auswahl+" und drucken_in_pdf="+drucken_in_pdf);
    }
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt drucken

Beitrag von mampfi » 08.09.2015 18:34:46

Statt hier ständig neue Threads zu eröffnen, hab ich mal das "gelöst" auf [knowhow thread] gesetzt.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt

Beitrag von mampfi » 08.09.2015 18:45:04

So die aktuelle Routine, weil man aus der (vielleicht) was lernen kann.

Erklärung:

Es gibt in der Adressverwaltung ein Feld prio. Wählt man prio <= 1 aus entsteht das kurze Telefonzettelchen bei <= 5 werden es alle Datensätze.

Es werden mit QInputDialog der Wert prio und 1 oder 0 (PDF oder Direktdruck) abgefragt.


Bei prio 5 passen die Zeilen nicht auf eine Seite.

Bei jeder Zeile wird y erhöht und bei 1000 gibts eine neue Seite (Wert momentan versuchsweise ermittelt, Neuigkeit in Fett)

-----------------------------------------------------

void MainWindow::sub_drucke_liste()

{
QPrinter printer;
QPainter painter;
int x, y, delta_y, fontsize;
QString drucken_in_pdf;
QString prio_auswahl;

qDebug()<< "Hier ist sub_drucke_liste()" << "--";

//------------------------------------
prio_auswahl = QInputDialog::getText(this, "Prio_auswahl", "");

if (prio_auswahl == "")
{
//QMessageBox::information(this, "Info", "Keine Eingabe, Prio wird automatisch auf 1 gesetzt");
prio_auswahl = "1";
}
//------------------------------------

//sqlstatement = "SELECT * FROM adr ORDER BY nachname, vorname;";
sqlstatement = "SELECT * FROM adr WHERE prio <= ";
sqlstatement += prio_auswahl;
sqlstatement += " ORDER BY nachname, vorname;";

qDebug()<< "sub_drucke_liste() sqlstatement=" << sqlstatement;

sqlBefehl = QSqlQuery(db);
sqlBefehl.exec(sqlstatement);

QSqlError fehler = sqlBefehl.lastError();
if (fehler.isValid()) QMessageBox::information(this, "Fehler in Suchen", fehler.databaseText());

//------------------------------------
//drucken_in_pdf = "0";
drucken_in_pdf = QInputDialog::getText(this, "drucken_in_pdf (1,0)", "");
if (drucken_in_pdf == "")
{
//QMessageBox::information(this, "Info", "Keine Eingabe, drucken_in_pdf wird automatisch auf 1 gesetzt");
drucken_in_pdf = "1";
}

if (drucken_in_pdf == "1")
{
//QMessageBox::information(this, "Info", "Drucke in pdf-Datei");
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("adr_datensatz.pdf");
}
//------------------------------------

x=0; y=0; fontsize=8; delta_y=fontsize+4;
painter.begin(&printer);

painter.setFont(QFont("Arial", fontsize, QFont::Normal));

while ( sqlBefehl.next())
{
sub_fuelle_variablen();

QString Trenner="|";

//ui->textEdit->append("sub_drucke_liste="+firma + Trenner + vorname + Trenner + nachname+ Trenner + plz + Trenner + ort + Trenner + strasse + Trenner + telefon + Trenner + telefon_2 + Trenner + email + Trenner + bemerkung + Trenner + zusatzfeld_1 + Trenner + zusatzfeld_2);

painter.drawText(x, y+=delta_y, firma + Trenner + vorname + Trenner + nachname + telefon + Trenner + telefon_2 + Trenner + plz + Trenner + ort + Trenner + strasse + Trenner + Trenner + email + Trenner + bemerkung + Trenner + zusatzfeld_1 + Trenner + zusatzfeld_2);

//if (bemerkung != "") qDebug()<<"bemerkung nicht leer + name=" +vorname + "|||" + nachname; //d3
//if (zusatzfeld_1 != "") qDebug()<<"zusatzfeld 1 nicht leer + name=" +vorname + "|||" + nachname; //d3
//if (zusatzfeld_2 != "") qDebug()<<"zusatzfeld 2 nicht leer + name=" +vorname + "|||" + nachname; //d3

//painter.drawText(x, y+=delta_y, ">>"+firma + Trenner + vorname + Trenner + nachname+ Trenner + plz + Trenner + ort + Trenner + strasse + Trenner + telefon + Trenner + telefon_2 + Trenner + email + Trenner);
//painter.drawText(x, y+=delta_y, "--" + bemerkung + zusatzfeld_1 + Trenner + zusatzfeld_2);

if (vorname=="Udo") qDebug() << "####" << vorname << "|||" << nachname << "y=" << y; //d3 Zum Feststellen, wieviele Zeilen auf eine Seite passen

if (y > 1000)
{
printer.newPage();
y=0;
}


}
Zuletzt geändert von mampfi am 26.09.2015 11:31:21, insgesamt 1-mal geändert.
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [knowhow thread]qt drucken

Beitrag von eggy » 09.09.2015 01:12:08

mampfi hat geschrieben: bei 1000 gibts eine neue Seite (Wert momentan versuchsweise ermittelt,
und genau dagegen gibts QFontmetrics:

Code: Alles auswählen

QFont font("times", 24);
QFontMetrics fm(font);
int pixelsWide = fm.width("What's the width of this text?");
int pixelsHigh = fm.height();
(Beispielcode stammt von http://doc.qt.io/qt-5/qfontmetrics.html#details )

Also einfach den verwendeten Font eintragen, eine Beispielzeile generieren und den ermittelten Wert weiterverwenden. Die aktuelle Seitengröße bekommst Du auch irgendwie, wahrscheinlich über QPrinter.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt drucken

Beitrag von mampfi » 09.09.2015 11:29:33

Nochmal herzlichen Dank für die Hilfe.


Wobei diese Telefonzettelchen ein Relikt sind von meinem PHP-Programm, hier sind die nämlich HTML-Dateien.

Man könnte mit diesen natürlich ganz elegant fragen, ob die Felder noch in eine Zeile passen, und dann einen Zeilenumbruch simulieren, aber ich ich glaub, so weit werde ich es (momentan!) nicht treiben.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt drucken

Beitrag von mampfi » 20.09.2015 12:40:38

Hier gleich noch ein Link, der nicht primär was mit Drucken zu tun hat, aber mit qt:

http://www.qtforum.de/forum/viewtopic.p ... 956#p79956
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [knowhow thread]qt drucken

Beitrag von eggy » 20.09.2015 15:27:26

Wenn Du in/aus Dateien schreiben/lesen willst, schau Dir mal QFile an: http://doc.qt.io/qt-5/qfile.html
aus der Qt Doku:

Code: Alles auswählen

  QFile file("out.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    QTextStream out(&file);
    out << "The magic number is: " << 49 << "\n";

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt drucken

Beitrag von mampfi » 20.09.2015 15:36:06

Mit Absicht hab ich hier nicht die qt-spezifischen Funktionen genutzt.

Denn wenn Bibliotheken entstehen, dann kann man sie für C++ und "QT-C++" verwenden.

"Früher" hab ich erst die Bibliotheken entworfen, die sollten dann von Turbo-Pascal bis C, C++ verwendbar sein.
Aber irgendwann programmiert man dann nur noch an den Bibliotheken ;-)

Die QT-Variante werde ich aber auch noch ausprobieren. :THX:
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [knowhow thread]qt-Fragen

Beitrag von eggy » 20.09.2015 15:50:12

Wenn ich schon "in Qt bin", dann versuch ich die meisten Funktionen auch in Qt zu halten. So ist die Anpassung auf andere Qt unterstützte System (Android, Win, Mac ...) dann später um einiges leichter. Und ein weiterer Vorteil ist, ich brauch mich nicht weiter darum kümmern, welche externen Libs in welchen Kombinationen wie zusammen funktionieren oder wo es scheppert.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt-Fragen

Beitrag von mampfi » 25.09.2015 11:46:36

Das Schreiben und Verwenden von Bibliotheken ist dann allerdings hinfällig. Man läuft dann immer den Programmiersprachen-System hinterher.

Mich wundert es doch ein bißchen, warum man für die gleichen Funktionen wieder andere Befehle erfindet.

C++ ist ja auch ein Standard, und diese "Verfehlung" war ja nur für den Export. ;-)

Danke nochmal an dieser Stelle für die Hilfe.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: [knowhow thread]qt-Fragen

Beitrag von mampfi » 27.09.2015 12:44:24

So ich hab nun die Exportfunktion in anständige QT-Befehle gekleidet:

http://www.qtforum.de/forum/viewtopic.p ... 985#p79985
Es gibt viele Foren

Antworten