QCompleter의 QuoteView로 가속화 표시를 가속화합니다.

7675 단어 Qt

한마디로



대량의 아이템이 후보가 되면, QListView 의 표시가 느려지므로, QCompleter::setPopup(QAbstractItemView*)QTableView 를 팝업에 이용한다.

QCompleter를 사용한 솔직한 샘플의 성능 문제



솔직하게 QCompleter에서 20000 건 정도의 후보 중에서 선택하면,
키 입력으로 좁힌 수가 많을 때 QListView의 표시가 붙어 버린다.

특히 처음 1문자라면 표시 대기 시간이 길다.
#include <QApplication>
#include <QLineEdit>
#include <QCompleter>

int main(int argc, char **argv) {
    QApplication app(argc, argv);

    QLineEdit *edit = new QLineEdit;

    // サジェストに利用する候補文字列を生成
    QList<QString> candidates;
    for (int i = 0; i < 5000; ++i) {
        candidates << QString("hoge%1").arg(i, 5, 10, QChar('0'))
                   << QString("huga%1").arg(i, 5, 10, QChar('0'))
                   << QString("foga%1").arg(i, 5, 10, QChar('0'))
                   << QString("fuga%1").arg(i, 5, 10, QChar('0'));
    }

    // サジェストを提供する QCompleter を生成する
    QCompleter *comp = new QCompleter(candidates, edit)
    edit->setCompleter(comp);

    edit->show();
    app.exec();
}

해결책 QListView 대신 QTableView 사용


QCompleter::setPopup(QAbstractItemView*)를 사용하면 후보 팝업 표시에 사용할 위젯을 설정할 수 있습니다.setPopup() 에서 QTableView 를 팝업으로 설정하면 표시가 빨라집니다.
다만, 단순히 new QTableView 그대로의 뷰에서는, 헤더가 표시되어 버리므로, 행 헤더나 열 헤더를 비표시로 해, 행의 높이를 조정한다.
QTableView *popup = new QTableView();
// 列ヘッダを非表示にする。
popup->horizontalHeader()->hide();
// 候補の右側に余計なスペースが表示されないようにストレッチモードを変更
popup->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // Qt4 だと setResizeMode()
// 行ヘッダを非表示にする
popup->verticalHeader()->hide();
// 候補1行の高さを調整
popup->verticalHeader()->setDefaultSectionSize(20);

// 候補のポップアップに QTableView を使う
comp->setPopup(popup);

실행 결과 비교



기본 팝업



우선, 디폴트의 팝업 표시로 표시했을 경우는, 이하와 같이 된다.
이미지는 알 수 없지만이 표시에는 몇 초가 걸립니다.

그림. 디폴트의 팝업으로 표시했을 경우의 후보 표시


팝업에 QTableView(조정 없음)를 사용한 결과



다음으로, QCompleter::setPopup() 로 QTableView 를 지정했을 경우의 표시는, 다음과 같이 된다.

그림. QTableView(조정 없음) 팝업으로 표시했을 경우의 후보 표시


팝업에 QTableView(조정 불일치)를 사용한 결과



마지막으로, QCompleter::setPopup() 로 헤더의 사이즈등을 조정한 QTableView 를 지정했을 경우의 표시는, 이하와 같이 된다.

그리드의 선이 표시되어 버리고 있지만, 한층 더 조정하면 지울 수 있을 것이다.

그림. QTableView(조정 후)를 팝업에 표시했을 경우의 후보 표시

좋은 웹페이지 즐겨찾기