[knowhow thread]qt-Fragen
-
- 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
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;
}
}
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
Re: [knowhow thread]qt drucken
und genau dagegen gibts QFontmetrics:mampfi hat geschrieben: bei 1000 gibts eine neue Seite (Wert momentan versuchsweise ermittelt,
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();
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.
-
- 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
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.
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
-
- 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
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
http://www.qtforum.de/forum/viewtopic.p ... 956#p79956
Es gibt viele Foren
Re: [knowhow thread]qt drucken
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:
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";
-
- 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
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.
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.
Es gibt viele Foren
Re: [knowhow thread]qt-Fragen
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.
-
- 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
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.
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
-
- 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
So ich hab nun die Exportfunktion in anständige QT-Befehle gekleidet:
http://www.qtforum.de/forum/viewtopic.p ... 985#p79985
http://www.qtforum.de/forum/viewtopic.p ... 985#p79985
Es gibt viele Foren