Foros del Web » Programación para mayores de 30 ;) » C/C++ »

QStringList, API win para imprimir y acentos

Estas en el tema de QStringList, API win para imprimir y acentos en el foro de C/C++ en Foros del Web. Hola Tengo esta función que usa la API de windows para imprimir, no la escribí yo, la copié de un ejemplo de la web de ...
  #1 (permalink)  
Antiguo 08/12/2016, 04:19
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 128
Antigüedad: 7 años, 5 meses
Puntos: 11
QStringList, API win para imprimir y acentos

Hola

Tengo esta función que usa la API de windows para imprimir, no la escribí yo, la copié de un ejemplo de la web de microsoft y la modifiqué un poco:

Código C++:
Ver original
  1. bool imprimirTicket(QString impresora, QByteArray datos)
  2. {
  3.     wchar_t szPrinterName[255];
  4.     int length = impresora.toWCharArray(szPrinterName);
  5.     szPrinterName[length] = 0;
  6.  
  7.     HANDLE hPrinter;
  8.     DOC_INFO_1 DocInfo;
  9.     DWORD dwJob;
  10.     DWORD dwBytesWritten;
  11.  
  12.     // Need a handle to the printer.
  13.     if(!OpenPrinter(szPrinterName, &hPrinter, NULL)) {
  14.         qDebug() << "Error al abrir la impresora " << impresora;
  15.         return false;
  16.     }
  17.  
  18.     // Fill in the structure with info about this "document."
  19.     DocInfo.pDocName = L"Ticket";
  20.     DocInfo.pOutputFile = NULL;
  21.     DocInfo.pDatatype = L"RAW";
  22.  
  23.     // Inform the spooler the document is beginning.
  24.     if((dwJob = StartDocPrinter( hPrinter, 1, (LPBYTE)&DocInfo)) == 0) {
  25.         ClosePrinter(hPrinter);
  26.         qDebug() << "Error al crear el documento";
  27.         return false;
  28.     }
  29.  
  30.     // Start a page.
  31.     if(!StartPagePrinter(hPrinter)) {
  32.         EndDocPrinter(hPrinter);
  33.         ClosePrinter(hPrinter);
  34.         qDebug() << "Error al iniciar la página";
  35.         return false;
  36.     }
  37.  
  38.     // Send the data to the printer.
  39.     if(!WritePrinter(hPrinter, datos.data(), datos.length(), &dwBytesWritten)) {
  40.         EndPagePrinter(hPrinter);
  41.         EndDocPrinter(hPrinter);
  42.         ClosePrinter(hPrinter);
  43.         qDebug() << "Error al enviar los datos a la impresora";
  44.         return false;
  45.     }
  46.  
  47.     // End the page.
  48.     if(!EndPagePrinter(hPrinter)) {
  49.         EndDocPrinter(hPrinter);
  50.         ClosePrinter(hPrinter);
  51.         qDebug() << "Error al cerrar la página";
  52.         return false;
  53.     }
  54.  
  55.     // Inform the spooler that the document is ending.
  56.     if( ! EndDocPrinter(hPrinter)) {
  57.         ClosePrinter(hPrinter);
  58.         qDebug() << "Error al cerrar el documento";
  59.         return false;
  60.     }
  61.  
  62.     // Tidy up the printer handle.
  63.     ClosePrinter(hPrinter);
  64.  
  65.     // Check to see if correct number of bytes were written.
  66.     if(dwBytesWritten != datos.length()) {
  67.         qDebug() << "Error: No coindiden los bytes escritos";
  68.         return false;
  69.     }
  70.  
  71.     return true;
  72. }

Si no recuerdo mal, la copié de aquí:
https://support.microsoft.com/es-es/kb/138594

En principio la usaba para abrir el cajón portamonedas y ningún problema, ahora quiero imprimir pequeños textos y lo hace, pero no me imprime los acentos ni los caracteres como la 'ñ'. Los textos que tengo que imprimir los tengo en un QStringList, este podría ser un ejemplo de llamada:

Código C++:
Ver original
  1. QStringList ticketPrueba;
  2.     ticketPrueba << "Ticket de prueba";
  3.     ticketPrueba << "á é í ó ú ñ Ñ";
  4.     ticketPrueba << "Gracias por su visita";
  5.  
  6.     QByteArray texto;
  7.     foreach(QString linea, ticketPrueba) {
  8.         texto.append(linea.toStdString().c_str());
  9.         texto.append('\n');
  10.     }
  11.     texto.append('\n'); // un espacio extra al final
  12.  
  13.  
  14.     if(imprimirTicket(impresora, texto))
  15.         qDebug() << "Ticket impreso con éxito";

Todo bien, pero la tercera línea, la de los acentos, pues salen caracteres raros. ¿Cómo podría hacer para que me imprima los acentos?

Un saludo
  #2 (permalink)  
Antiguo 11/12/2016, 04:05
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 128
Antigüedad: 7 años, 5 meses
Puntos: 11
Respuesta: QStringList, API win para imprimir y acentos

Hola

Bueno, me acabo de dar cuenta de que el problema no es de mi programa ni de Qt, si envío esos mismos caracteres desde notepad o cualquier otro obtengo el mismo resultado.

O sea, que es problema de configuración de la impresora. uff, ahora me toca pelearme con las secuencias de escape de la impresora.

Un saludo



La zona horaria es GMT -6. Ahora son las 08:07.