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(조정 후)를 팝업에 표시했을 경우의 후보 표시
Reference
이 문제에 관하여(QCompleter의 QuoteView로 가속화 표시를 가속화합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/osamu0329/items/d4b9776edb123966e8be
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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();
}
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);
Reference
이 문제에 관하여(QCompleter의 QuoteView로 가속화 표시를 가속화합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/osamu0329/items/d4b9776edb123966e8be텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)