2016-09-19 18 views
0

印刷用に非常にカスタムのウィジェットを作成する必要があります。マルチプラットフォームでなければなりません。一貫性を保つために、ウィジェットはlinuxやmacのようにウィンドウ内で似ているはずです... Windowsの印刷ダイアログを使用するQtコードを勉強した後、私はQtの印刷ダイアログをサブクラス化することを断念し、独自のウィジェットを作成しました。Windowsでシステムプリンタ名のリストを取得するのが非常に遅い

今、私はステップ1に入っています:システム上のプリンタのリストを入力してください。私は、プログラムの実行中にシステム上のプリンタが変更されても機能するように、それぞれの "show()"で呼び出される次のコードを追加しました。それは動作しますが、極端に遅いです:

私は、プリンタに追加し、デフォルトのプリンタをインデックス-1として追加してウィジェットに通知します。

QMap<int, QString> PrintController::getListOfSystemPrinters() 
{ 
    QMap<int, QString> printerNames; 

#ifdef Q_OS_WIN32 
#ifdef NOT_QT_4 // I tried to use "availablePrinterNames" thinking it will be faster but it actually seems slower 
    QPrinter currentPrinter; 
    QString printerName = currentPrinter.printerName(); 

    QStringList printerNameList = QPrinterInfo::availablePrinterNames(); 

    int index = 0; 
    foreach(QString printerName1, printerNameList) 
    { 
     printerNames.insert(index, printerName1); 
     if(printerName == printerName1) 
      printerNames.insert(-1, printerName1); 
     ++index; 
    } 
#else 
    QPrinter currentPrinter; 
    QString printerName = currentPrinter.printerName(); 

    QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters(); 

    int index = 0; 
    foreach(QPrinterInfo printerInfo, printers) 
    { 
     QString printerName1 = printerInfo.printerName(); 
     printerNames.insert(index, printerName1); 
     if(printerName == printerName1) 
      printerNames.insert(-1, printerName1); 
     ++index; 
    } 
#endif 
#elif defined Q_OS_UNIX 

#endif 

    return printerNames; 
} 

これは私が持っているコードの中で最も遅いものです!私はすべてのプリンタ名を取得する別の方法を参照してください...しかし、私は何か間違っている必要があります!
Qt 5バージョンはQt 4バージョンよりやや遅いです...いずれにしても、どちらも遅いです...
QPrinterInfoを作成する呼び出しが遅いです。
他の選択肢はありますか?

Windowsでプリンタ名のリストを取得するにはどうすればよいですか?

注これは4.7-5.x

+0

ここで 'availablePrinterNames()'(Windowsの場合はQt 5.6.1)には '9-13msecs'が終わります。 'availablePrinters()'は '' 110-150 msecs程度です。それは長い時間ではなく、私は本当にあなたの現在の設定、おそらくあなたのプリンタのドライバと関係していると思うでしょう – Mike

+0

@マイク - 私は、遅さがネットワークプリンタを持つことと関係があるかもしれないことをオンラインで読んで...可能です私は実際のプリンタに実際に解決しないネットワークプリンタをインストールしたこともあります...ただ、それを見るのは時間がかかりませんでした。それにはavailablePrinterNamesを使用すると少し時間がかかります。しかし、プリンタ自体のためにする必要があります... idk – Thalia

答えて

2

ゲットプリンタリストに非同期のQtで作業する必要があります。

class Class : public QObject { 
    Q_OBJECT 
    Q_SIGNAL void hasPrinters(const QList<QPrinterInfo> &); 
    Q_SIGNAL void hasPrinterNames(const QStringList &); 

    /// This method is thread-safe 
    void getPrinters() { 
#if QT_VERSION >= QT_VERSION_CHECK(5,3,0) 
     emit hasPrinterNames(QPrinterInfo::availablePrinterNames()); 
#else 
     emit hasPrinters(QPrinterInfo::availablePrinters()); 
#endif 
    } 
    void test() { 
     QtConcurrent::run(this, &Class::getPrinters); 
    } 
}; 

上記のコンパイルをQtの4.7 &までに、いずれかを使用して98またはC++ C++ 11。

hasPrinterNames/hasPrinters信号に接続して、プリンタリストが利用可能になったときに通知し、ダイアログに入力します。

availablePrinterNames/availablePrintersはスレッドセーフである可能性があります。私はそれがチェックされていない。

Qt 5.3以降では、ユーザーが一度選択したプリンタにのみQPrinterInfoを作成し、同時に作成することもできます。