2015-01-30 4 views
0

Я изучаю основы Web Toolkit (Wt, AKA «Witty»). Теперь я борюсь с WTableViews и QueryModels. Я не могу извлечь выбранную запись.Wt - Как получить выбранную запись из WTableView?

У меня есть эта таблица TableTag определяется как:

class TableTag 
{ 
public: 
    static const unsigned int tableVersion = 1; 
    std::string name; 

    TableTag(); 
    ~TableTag(); 
    static void initTableRecords(Wt::Dbo::Session &_session); 

    template<class Action> 
    void persist(Action &_action) 
    { 
     Wt::Dbo::field(_action, name, "Name"); 

     //Wt::Dbo::hasMany(_action, tablePosts, Wt::Dbo::ManyToMany, "Post"); 
    } 
}; 
typedef Wt::Dbo::collection< Wt::Dbo::ptr<TableTag> > TableTags; 

Я показываю это так:

DDBBApp::DDBBApp(const WEnvironment& _env) : WApplication(_env), 
    ddbbBackend_(DDBBApp::DDBB_DATA_NAME) 
{ 
    DDBBApp::setDDBBBackendAndSession(ddbbBackend_,ddbbSession_); 
    ctrNotice_ = new WText("Notice text"); //Informative text 

    //QueryModel  
    Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > * qmTags1 = new Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> >(); 
    qmTags1->setQuery(ddbbSession_.find<TableTag>()); 
    qmTags1->addAllFieldsAsColumns(); 

    //WTableView  
    ctrGridTags_ = new WTableView(); 
    ctrGridTags_->setModel(qmTags1); 
    ctrGridTags_->setSelectionMode(Wt::SelectionMode::SingleSelection); 
    this->root()->addWidget(ctrGridTags_); 
    this->root()->addWidget(new WBreak); 

    //Info text 
    this->root()->addWidget(ctrNotice_); 

    //Conection SIGNAL - SLOT 
    ctrGridTags_->selectionChanged().connect(this, &DDBBApp::onSelectionChanged); 
} 

Я хочу, чтобы получить запись, выбранную пользователем:

void DDBBApp::onSelectionChanged() 
{ 
    WString str("Select done: "); 

    WModelIndexSet indexSet_Tags = ctrGridTags_->selectedIndexes(); 
    for (WModelIndexSet::iterator index_iterator = indexSet_Tags.begin(); index_iterator != indexSet_Tags.end(); ++index_iterator) 
    { 
     //Here I get the idx of the record selected in WTableView 
     WModelIndex index = *index_iterator; 
     str += WString(std::to_string(index.row())); 

     boost::any data = ctrGridTags_->model()->data(index); 
     if (data.type() == typeid(__int64)) 
     { 
      //Here I get the Id of record 
      __int64 dataint64 = boost::any_cast<__int64>(data); 
      str += " " + WString(std::to_string(dataint64)); 
     } 
     else 
     { 
      std::string dataTypeName(data.type().name()); 
      str += " (" + dataTypeName + ")"; 
     } 

     //THIS IS THE PROBLEMATIC SECTION 
     Wt::WAbstractItemModel * aim = ctrGridTags_->model(); //OK but it's not specifically related to TableTags (it's general) 
     Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > qmtt1(aim); //NULL ¿? 

     Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > queryModel = ctrGridTags_->model(); //NULL too ¿? 

     Wt::Dbo::QueryModel<Wt::Dbo::ptr<TableTag>> modelus = static_cast<Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> >> (ctrGridTags_->model()); //NULL... no way :-(   

           v-- error due to null value (qmtt1, queryModel, modelus) 
     std::string tagName = queryModel.resultRow(index.row()).get()->name; 
     str += " " + tagName ; 
    } 

    ctrNotice_->setText(str); 
} 

I подумайте, что код достаточно автоактивен. Я нашел самую ясную ссылку: How to get at underlying data in a WTableView based on a QueryModel?. Если попытаться, как предложено там, возникает несколько ошибок компиляции.

Отладка, я вижу член WTableView Модель как тип Wt :: Dbo :: QueryModel < Wt :: Dbo :: ptr>. Но когда ему присваивается другая переменная того же типа, эта переменная не получает ее. Зачем?

Может ли кто-нибудь указать мне правильный путь, пожалуйста?

EDIT 1

я указываю некоторые дополнительные детали:

Мой код включает следующие заголовки:

#include <Wt/Dbo/Dbo> 
#include <Wt/Dbo/Backend/Sqlite3> 
#include <Wt/Dbo/Query> 
#include <Wt/Dbo/QueryModel> 
#include <Wt/Dbo/SqlTraits> 
#include <Wt/Dbo/Types> 
#include <Wt/Dbo/WtSqlTraits> 

Если я попробовать этот путь (по аналогии с предложенной Коен):

Wt::Dbo::QueryModel<TableTag> *modelKoen = dynamic_cast<Wt::Dbo::QueryModel<TableTag> *> (ctrGridTags_->model()); 

Я получаю этот компилятор Ошибка ция:

C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/SqlTraits_impl.h(50): error C2039: 'read' : is not a member of 'Wt::Dbo::sql_value_traits<Result,void>' 
      with 
      [ 
       Result=TableTag 
      ] 
*** 
*** NOT TRANSLATED FROM SPANISH *** 
*** 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/SqlTraits_impl.h(48) : durante la compilación de la función miembro de plantilla de clase 'TableTag Wt::Dbo::query_result_traits<Result>::load(Wt::Dbo::Session &,Wt::Dbo::SqlStatement &,int &)' 
      with 
      [ 
       Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/collection_impl.h(186) : vea la referencia a la creación de instancias de plantilla de función 'TableTag Wt::Dbo::query_result_traits<Result>::load(Wt::Dbo::Session &,Wt::Dbo::SqlStatement &,int &)' que se está compilando 
      with 
      [ 
       Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/SqlTraits_impl.h(27) : durante la compilación de la función miembro de plantilla de clase 'void Wt::Dbo::query_result_traits<Result>::getFields(Wt::Dbo::Session &,std::vector<std::string,std::allocator<_Ty>> *,std::vector<Wt::Dbo::FieldInfo,std::allocator<Wt::Dbo::FieldInfo>> &)' 
      with 
      [ 
       Result=TableTag 
    ,   _Ty=std::string 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/Query_impl.h(106) : vea la referencia a la creación de instancias de plantilla de función 'void Wt::Dbo::query_result_traits<Result>::getFields(Wt::Dbo::Session &,std::vector<std::string,std::allocator<_Ty>> *,std::vector<Wt::Dbo::FieldInfo,std::allocator<Wt::Dbo::FieldInfo>> &)' que se está compilando 
      with 
      [ 
       Result=TableTag 
    ,   _Ty=std::string 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/Query_impl.h(102) : durante la compilación de la función miembro de plantilla de clase 'std::vector<Wt::Dbo::FieldInfo,std::allocator<_Ty>> Wt::Dbo::Impl::QueryBase<Result>::fields(void) const' 
      with 
      [ 
       _Ty=Wt::Dbo::FieldInfo 
    ,   Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/Query_impl.h(133) : vea la referencia a la creación de instancias de plantilla de función 'std::vector<Wt::Dbo::FieldInfo,std::allocator<_Ty>> Wt::Dbo::Impl::QueryBase<Result>::fields(void) const' que se está compilando 
      with 
      [ 
       _Ty=Wt::Dbo::FieldInfo 
    ,   Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/Query_impl.h(124) : durante la compilación de la función miembro de plantilla de clase 'std::pair<Wt::Dbo::SqlStatement *,Wt::Dbo::SqlStatement *> Wt::Dbo::Impl::QueryBase<Result>::statements(const std::string &,const std::string &,const std::string &,int,int) const' 
      with 
      [ 
       Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/Query_impl.h(483) : vea la referencia a la creación de instancias de plantilla de función 'std::pair<Wt::Dbo::SqlStatement *,Wt::Dbo::SqlStatement *> Wt::Dbo::Impl::QueryBase<Result>::statements(const std::string &,const std::string &,const std::string &,int,int) const' que se está compilando 
      with 
      [ 
       Result=TableTag 
      ] 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/QueryModel_impl.h(137) : durante la compilación de la función miembro de plantilla de clase 'void Wt::Dbo::QueryModel<TableTag>::setCurrentRow(int) const' 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/QueryModel_impl.h(127) : vea la referencia a la creación de instancias de plantilla de función 'void Wt::Dbo::QueryModel<TableTag>::setCurrentRow(int) const' que se está compilando 
      C:\Opt\Wt 3.3.3 msvs2013 x64\include\Wt/Dbo/QueryModel_impl.h(126) : durante la compilación de la función miembro de plantilla de clase 'boost::any Wt::Dbo::QueryModel<TableTag>::data(const Wt::WModelIndex &,int) const' 

Насколько я видел в Интернете, общие ошибки

'read' : is not a member of 'Wt::Dbo::sql_value_traits<long,void> 
'read' : is not a member of 'Wt::Dbo::sql_value_traits<string,void> 

и так далее. Сравните те с моим

'read' : is not a member of 'Wt::Dbo::sql_value_traits<Result,void> 

Они, как правило, решаются в том числе заголовки

#include <Wt/Dbo/SqlTraits 
#include <Wt/Dbo/WtSqlTraits> 

, но не в моем случае.

Любое предложение?

ответ

0

О, мой, я, наконец, получил это сам.

Правильный путь был:

Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > * qmTags = static_cast<Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > *>(ctrGridTags_->model()); 

вместо:

Wt::Dbo::QueryModel<Wt::Dbo::ptr<TableTag>> modelus = static_cast<Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> >> (ctrGridTags_->model()); 

Полученный рабочий код будет выглядеть следующим образом:

void DDBBApp::onSelectionChanged() 
{ 
    WString str("Select done: "); 

    WModelIndexSet indexSet_Tags = ctrGridTags_->selectedIndexes(); 
    for (WModelIndexSet::iterator index_iterator = indexSet_Tags.begin(); index_iterator != indexSet_Tags.end(); ++index_iterator) 
    { 
     WModelIndex index = *index_iterator; 
     str += WString(std::to_string(index.row())); 

     boost::any data = ctrGridTags_->model()->data(index); 
     if (data.type() == typeid(int)) 
     { 
      int dataInt = boost::any_cast<int>(data); 
      str += " " + WString(std::to_string(dataInt)); 
     } 
     else if (data.type() == typeid(std::string)) 
     { 
      std::string dataString = boost::any_cast<std::string>(data); 
      str += " " + WString(dataString); 
     } 
     else if (data.type() == typeid(long)) 
     { 
      long dataLong = boost::any_cast<long>(data); 
      str += " " + WString(std::to_string(dataLong)); 
     } 
     else if (data.type() == typeid(__int64)) 
     { 
      __int64 dataint64 = boost::any_cast<__int64>(data); 
      str += " " + WString(std::to_string(dataint64)); 
     } 
     else 
     { 
      std::string dataTypeName(data.type().name()); 
      str += " (" + dataTypeName + ")"; 
     } 

     Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > * qmTags = static_cast<Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> > *>(ctrGridTags_->model()); 
     std::string tagName = qmTags->resultRow(index.row()).get()->name; 
     str += " " + tagName; 
    } 

    ctrNotice_->setText(str); 
} 
Смежные вопросы