[knowhow thread]qt-Fragen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1736
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: 1736
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: 1736
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: 1736
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: 1736
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: 1736
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