[SOLVED] Why QPrinter need QtGUI
-
Hi everyone
I would to know why I must have a X11 server connection to use the QPrinter Class. In Qt 4.3, I wrote a programm which use Qprinter without the GUI and it works well.
But I need to compile it on a new platform which has Qt 4.6 and it doesn't work because of the GUI.DO you have an answer ?
Thanks -
Hi. yes, my .pro file has the console config.
@QT += core
TARGET = ptest
CONFIG += console
CONFIG -= app_bundleTEMPLATE = app@
To use QPrinter (with Qt > 4.4), it needs QPaintDevice. This one needs QApplication which needs a server X connexion. That is I have deduced by testing only QPrinter in a test programm like this :
@#include <QtCore/QCoreApplication>
#include <Qt/qprinter.h>
#include <iostream>using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout << "step 1" << endl;
QPrinter pt(QPrinter::HighResolution);
cout << "step 2" << endl;
}@The programm abord before the step 2 :
bq. step 1
QPrinter: Must construct a QApplication before a QPaintDevice
AbortedI don't know how to fix it because I can't change Qt version on the server and I think there isn't a "QPrinter like" class which do the same thing without needing server X connexion...
-
QPrint is now a QWidget class, so you are not able to print without gui. But you can do in a old fashion c++ way. Here some sample:
@#include <iostream.h>
#include <fstream.h>
#include <conio.h>void main(void)
{
clrscr();
char filename[13];
char ch;
cout<<"\nEnter the text file name:";
cin.getline(filename,13);
cout<<"\n";
ifstream fin(filename, ios::in);
if(!fin)
{
cerr<<"\n Cannot open file !\n";
getch();
return;
}
char const * const PrinterName = "usb001:"; // Identify the printer port.
ofstream printer(PrinterName); // Open the printer stream.
if(!printer) // Ensure the printer stream opened ok.
{
cerr << "\a\n\tERROR: Unable to open " << PrinterName << endl;
cout << "\n\tPress the [ENTER] key to return ";
getch();
return;
}while (! fin.eof()) { fin.get(ch); printer << (ch); } printer << endl << ends << flush; printer.close(); // Finish the print job by closing the printer stream. fin.close(); // Send a carriage return and a formfeed to the printer so that: a) this // print job is ejected from the printer, and b) the next print job starts // at the top left corner of the page. fin.close(); // Close file./ cout << "\n\n\t\t\t\Printing..."; cout << "\n\n\ Please press the [ENTER] key to return"; getch(); return;
}@
-
You can't print without GUI using any of known printing library... GhostScript also needs X libraries... You can use framebuffers to do it in console mode, but you will need GUI libs in any way....
P.S.: Only Dot Printers do not need GUI to print ;)
-
[quote author="AcerExtensa" date="1370616218"]You can't print without GUI using any of known printing library... GhostScript also needs X libraries... You can use framebuffers to do it in console mode, but you will need GUI libs in any way....
P.S.: Only Dot Printers do not need GUI to print ;)[/quote]
U can print in Linux in every kind of printer without gui! U just need to have proper driver on kernel if not paralel or serial printer, is nothing to do about if is a dot printer or laser ... it's the port and driver issues.
-
@
[quote author="bjanuario" date="1370619483"]
U can print in Linux in every kind of printer without gui! U just need to have proper driver on kernel if not paralel or serial printer, is nothing to do about if is a dot printer or laser ... it's the port and driver issues.[/quote]
@No, you can't :) all console printers uses framebuffers.... sure you can send to printer some kind of scratch and let print it, but we a talking not just physical printing... you can't generate print-page without X!
-
If u use graphics, for sure this will be kind tricky, but some printers support decode chars that then print graphics even without X, for text is straight on. I can assure u because we use this on linux ;) On windows i dunno if is possible ...
[quote author="AcerExtensa" date="1370639879"]@
[quote author="bjanuario" date="1370619483"]
U can print in Linux in every kind of printer without gui! U just need to have proper driver on kernel if not paralel or serial printer, is nothing to do about if is a dot printer or laser ... it's the port and driver issues.[/quote]
@No, you can't :) all console printers uses framebuffers.... sure you can send to printer some kind of scratch and let print it, but we a talking not just physical printing... you can't generate print-page without X! [/quote]
-
Tell us what do you use and how do you do it! Maybe you have something what peoples with PostScript printers all other the world are looking for...
-
So, if I undestand what you said... Before Qt4.4, it was possible to use QPrinter to generate a PDF file but now, with Qt I can't print a PDF file with QPrinter if my Linux doesn't have a GUI ? ...
Do you know another way to print a QImage in a PDF file, without using GUI ?
-
QImage and QPrinter inherits QPaintDevice, and QPaintDevice is an GUI Class. So you need QtGUI library if you would like to use this two classes.
-
you can still use virtual framebuffer like Xvfb
-
Please add prefix "[SOLVED]" to the left of the topic subject. Thanks!
-
Hi Pitchou.
How did you use XVFB to create the QPrinter?I need to make a PDF printer in a console application and I get the same error you got.
-
Hi Fernando, I changed my way. I do not use XVFB anymore because I found a solution to use QPriner without serverX.
My error was to use QApplication, which require a serverX. I found a trick !
When you use QApplication, I think you use it like this :
@QApplication a(argc, argv,);@Change it to have something like this : @QApplication a(argc, argv, false);@
The false attribute will force the program to work without a serverX and you can use QPrinter without any problem
-
Thank you Pitchou!
It is working now! :D