Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QApplication>
- #include <QList>
- #include <Map>
- #include <QGridLayout>
- #include <QStandardItemModel>
- #include <QLineEdit>
- #include <QPushButton>
- #include <QListView>
- #include <QFutureWatcher>
- #include <QtConcurrent>
- #include <functional>
- struct Result
- {
- QString text;
- QString site;
- };
- class ISearchable
- {
- public:
- virtual QList<Result> search(const QString &query) = 0;
- };
- class SiteA : public ISearchable
- {
- public:
- QList<Result> search(const QString &query) Q_DECL_OVERRIDE
- {
- QList<Result> results;
- QThread::sleep(1);
- Result example;
- example.text = "This is an example of search from SiteA";
- example.site = "sitea";
- results << example;
- return results;
- }
- };
- class SiteB : public ISearchable
- {
- public:
- QList<Result> search(const QString &query) Q_DECL_OVERRIDE
- {
- QList<Result> results;
- QThread::sleep(1);
- Result example;
- example.text = "This is an example of search from SiteB";
- example.site = "siteb";
- results << example;
- return results;
- }
- };
- QList<Result> runSearch(const QString &query, ISearchable* site){return site->search(query);}
- int main(int argc, char *argv[])
- {
- QApplication application(argc, argv);
- QMap<QString, ISearchable *> container;
- container.insert("sitea", new SiteA);
- container.insert("siteb", new SiteB);
- QWidget mainWid;
- QGridLayout* mainLay= new QGridLayout(&mainWid);
- QStandardItemModel* baseModel = new QStandardItemModel(&mainWid);
- baseModel->insertColumn(0);
- QListView* resultList =new QListView(&mainWid);
- QLineEdit* queryEdit= new QLineEdit(&mainWid);
- QPushButton* searchBtn = new QPushButton(QStringLiteral("Search"),&mainWid);
- resultList->setModel(baseModel);
- mainLay->addWidget(queryEdit,0,0);
- mainLay->addWidget(searchBtn ,0,1);
- mainLay->addWidget(resultList ,1,0,1,2);
- using FutureTemplateArg = QList<Result>;
- QObject::connect(searchBtn ,&QPushButton::clicked,&mainWid,[baseModel,searchBtn ,queryEdit,&container]()->void{
- baseModel->removeRows(0,baseModel->rowCount());
- searchBtn->setEnabled(false);
- queryEdit->setEnabled(false);
- auto futWatch = new QFutureWatcher<FutureTemplateArg>(baseModel);
- QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,searchBtn,[searchBtn ,queryEdit](){
- searchBtn->setEnabled(true);
- queryEdit->setEnabled(true);
- });
- QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,baseModel,[futWatch,baseModel](){
- const FutureTemplateArg singleRes = futWatch->result();
- const int resSize = singleRes.size();
- if(resSize==0)
- return;
- const int startRow = baseModel->rowCount();
- baseModel->insertRows(startRow,resSize);
- for(int i=0;i<resSize;++i )
- baseModel->setData(baseModel->index(i+startRow,0),singleRes.at(i).site + " - " + singleRes.at(i).text);
- });
- QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,futWatch,&QObject::deleteLater);
- QFuture<FutureTemplateArg> calcResult = QtConcurrent::mappedReduced<FutureTemplateArg>(
- container
- , std::bind(runSearch,queryEdit->text(),std::placeholders::_1)
- , [](FutureTemplateArg& collection,const FutureTemplateArg& newRes){collection<<newRes;}
- );
- futWatch->setFuture(calcResult);
- });
- mainWid.show();
- return application.exec();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement