2015-07-30 41 views
5

Diciamo che alcune immagini devono essere generato da un programma di console Qt e che metriche di carattere sono necessari da algoritmi interni (che usa il testo larghezza/altezza come input per il calcolo la posizione in cui dovrebbe verificarsi il disegno). Questo programma deve essere eseguibile su Linux senza GUI (runlevel-3, fondamentalmente un cluster senza alcun server di visualizzazione).Ottenere metriche di font senza interfaccia grafica (modalità console)

Problema: QFontMetrics sono disponibili solo quando si esegue un'applicazione Qt in modalità GUI.
Qualsiasi soluzione alternativa per ottenere le metriche di stringa senza alcun server di visualizzazione?

+0

In effetti, quando si cerca di utilizzare un QFont senza applicazione attaccato getta 'fallimento ASSERT in QGuiApplication :: carattere(): "nessun caso QGuiApplication"'. So che non è una soluzione desiderabile, ma puoi creare un'applicazione fittizia e usarla come "contenitore" per i caratteri. Basta non eseguire l'app (app.exec()) ma cancellarla dopo l'uso. –

+0

hai bisogno del modulo 'gui', ma non hai bisogno di effettive' UI'. Probabilmente avrai anche bisogno di un oggetto 'QApplication' (non un' QCoreApplication'), ma non devi creare alcun widget. –

+0

sì, ma QApplication chiama exit (1) quando non c'è alcun server di visualizzazione ... – gpalex

risposta

2

Ok dopo ulteriori commenti Penso di aver capito il tuo problema. Basta fare in quel modo:

include <QApplication> 

int main(int argv, char **args) 
{ 
    QApplication app(argv, args); 
    QApplication::processEvents(); // this should allow `QApplication` to complete its initialization 

    // do here whatever you need 

    return 0; // or some other value to report errors 
} 

Si può anche provare utilizzare QGuiApplication questa versione non richiede (non usare) i widget.

Vedere anche example in documentation come gestire i casi gui.


Questo codice funziona perfettamente sul mio Ubnutu con Qt 5,3

#include <QGuiApplication> 
#include <QFontMetrics> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication a(argc, argv); 

    QFont font("Times", 10, QFont::Bold); 
    qDebug() << font; 
    QFontMetrics metrics(font); 

    qDebug() << metrics.boundingRect("test"); 

    return 0; 
} 

Funziona anche con Qt 4.8 quando si usa QApplication.

file di progetto era molto semplice

QT  += core 
TARGET = MetricsNoGui 
TEMPLATE = app 
SOURCES += main.cpp 
+0

Beh, temo di averti concesso la taglia troppo in fretta! lol. Sembra funzionare, ma in effetti se disinserite DISPLAY var env (nel terminale in cui chiamate quel programma), si bloccherà ancora: "QXcbConnection: Impossibile connettersi a display \ n Aborted (core dumped)" – gpalex