Russian Qt Forum
Сентябрь 30, 2024, 06:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Связь между QTableView и QTreeWidget  (Прочитано 7313 раз)
mark_o_polo
Гость
« : Март 13, 2010, 10:09 »

При выделении строки в таблице или нескольких строк те жеэлемента отмечаются в дереве:

connect(skkp_view, SIGNAL(clicked(const QModelIndex&)), this, SLOT(selected_SKP_Tree(const QModelIndex&)));

это находится в слоте который вызывается при загрузке сценария из базы данных:
Код:
// вывод таблицы средств
void PotokMainWindow::on_act_skkp_triggered()
{
     int index ;
    bool find ;
    int cols_to_show[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12, 13, 14, 15, 16, 17, 18, 19, 20,21, 22, 23};

    model_skkp->setHeaderData(0, Qt::Horizontal, QString::fromLocal8Bit("Порядковый номер"));
    model_skkp->setHeaderData(1, Qt::Horizontal, QString::fromLocal8Bit("Название"));
    model_skkp->setHeaderData(2, Qt::Horizontal, QString::fromLocal8Bit("Система"));
.....        
    model_skkp->setHeaderData(22, Qt::Horizontal, QString::fromLocal8Bit(""));
    model_skkp->setHeaderData(23, Qt::Horizontal, QString::fromLocal8Bit(""));

    index = findTypeTab(2, find) ;

    if(!find)
    {
        clear_derevo();
        QProgressDialog progress(QString::fromLocal8Bit("Загрузка каталога НС..."),
                             QString::fromLocal8Bit("Прервать"), 0, model_skkp->rowCount(), this);

        for (int n = 0; n < model_skkp->rowCount(); ++n)
        {
            addspis(QString::fromLocal8Bit("НС"),
                    model_skkp->record(n).value("name").toString());
            progress.setValue(n);

            if (progress.wasCanceled())
                break;
        }
    }

    skkp_view = new QPotokKOTableView(this, filter_ko);
    skkp_view->setModel(model_skkp);
    skkp_view->hideColumn(0);
    skkp_view -> setSelectionMode (QAbstractItemView::ExtendedSelection) ;
    skkp_view -> setSelectionBehavior (QAbstractItemView::SelectRows) ;
    skkp_view->setWindowTitle(QString::fromLocal8Bit("НС"));
    skkp_view->setWindowIcon(QIcon(QString::fromUtf8("img/skkp.png")));

    connect(skkp_view, SIGNAL(clicked(const QModelIndex&)), this, SLOT(selected_SKP_Tree(const QModelIndex&)));

    connect(skkp_view->verticalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selected_SKP_Tree(int))) ;

    connect(skkp_view, SIGNAL(dataChanged(int)), this, SLOT(selected_SKP_Tree(int)));

    tabWidget->insertTab(index, skkp_view, tr("НС"));
    tabWidget->setCurrentWidget( skkp_view );

    updateToolButtonState();
 
    for (int k = 0; k < model_ko->columnCount(); ++k)
    {
        skkp_view->setColumnHidden(k, true);
    }

    for (int j = 0; j < 24; ++j)
    {
        skkp_view->setColumnHidden(cols_to_show[j], false);
    }

    Tab_list.push_back(Tab_indexes( tabWidget->indexOf( skkp_view ), 2)) ;
}
я хочу, чтобы можно было выделять итемы на дереве и соответсвующие строки отмечались в таблице

поместил в конструктор главного окна:

connect(variant_NS, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(selected_SKP_Table(const QTreeWidgetItem *)));

где variant_NS это (здесь же чуть выше)

    variant_NS = new QTreeWidget;
    variant_NS->setColumnCount(1);
    variant_NS->setHeaderLabel(QString::fromLocal8Bit("НС"));
    variant_NS->setSelectionMode(QAbstractItemView::ExtendedSelection);
    variant_NS->setItemSelected(variant_NS->topLevelItem(0), true);

проблема в том, что при отмечании итема никакой реакции (не заходит в слот)
« Последнее редактирование: Март 26, 2010, 10:49 от mark_o_polo » Записан
mark_o_polo
Гость
« Ответ #1 : Март 16, 2010, 13:43 »

В общем есть QSqlTableModel, данные отображаются в QTableView и QTreeWidget. Как сделать так, чтобы при изменении в дереве менялось в таблице. (наоборот - работает (см. выше))  

    variant_NS = new QTreeWidget;
    variant_NS->setColumnCount(1);
    variant_NS->setHeaderLabel(QString::fromLocal8Bit("НС"));
    variant_NS->setSelectionMode(QAbstractItemView::ExtendedSelection);
    variant_NS->setItemSelected(variant_NS->topLevelItem(0), true);
пытаюсь вот так замутить:
 connect(variant_NS, SIGNAL(itemClicked(const QModelIndex&)), this, SLOT(selected_SKP_Table(const QModelIndex&)));
не работает



ПОДСКАЖИТЕ ПЛЗ КАК ЕЩЕ МОЖНО!!!
« Последнее редактирование: Март 16, 2010, 14:17 от mark_o_polo » Записан
alexman
Гость
« Ответ #2 : Март 16, 2010, 14:02 »

Так если ты меняешь модель, то соответственно все view отобразят эти изменения...
Записан
mark_o_polo
Гость
« Ответ #3 : Март 16, 2010, 14:50 »

нет я ставлю галочки в дереве, и мне надо, чтобы строки выделялись соответствующие в таблице
Записан
alexman
Гость
« Ответ #4 : Март 16, 2010, 15:01 »

Попробуй этот сигнал void   currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous ).
Записан
mark_o_polo
Гость
« Ответ #5 : Март 16, 2010, 21:02 »

делал такой сигнал currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous ) и такой currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ). Помещал в конструкторе главного окна (где объявляется переменная variant_NS) и в слоте  PotokMainWindow::on_act_skkp_triggered()  никакой реакции не происходит, когда ставлю галки в дереве, даже обидно..
Записан
alexman
Гость
« Ответ #6 : Март 17, 2010, 17:04 »

делал такой сигнал currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous ) и такой currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ). Помещал в конструкторе главного окна (где объявляется переменная variant_NS) и в слоте  PotokMainWindow::on_act_skkp_triggered()  никакой реакции не происходит, когда ставлю галки в дереве, даже обидно..
Код покажи. Должно работать!
Записан
mark_o_polo
Гость
« Ответ #7 : Март 20, 2010, 17:16 »

Да, но заработало только когда я убрал аргументы, сейчас пустые скобки
connect(variant_NS, SIGNAL(currentItemChanged()), this, SLOT(selected_SKP_Table()));

Теперь нужно, чтобы кликаешь на дереве - отмечалось в QTableView  та же строчка, помогите с кодом плз, срочно нужно, а я новичек, которого нелегкая занесла в дебри ООП.
для примера слот который отвечает за то, что когда отмечаешь в таблице - и в дереве отмечалось вот коннекты:
Код:
connect(skkp_view, SIGNAL(clicked(const QModelIndex&)), this, SLOT(selected_SKP_Tree(const QModelIndex&)));

connect(skkp_view->verticalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selected_SKP_Tree(int))) ;


и слоты
Код:
void PotokMainWindow::selected_SKP_Tree(const QModelIndex & index )
{
    int n_rows = model_skkp -> rowCount() ;
    QItemSelectionModel* skkp_selection_model = skkp_view->selectionModel() ;

    for(int n = 0; n < n_rows; ++n)
        variant_NS -> topLevelItem(0) -> child(n) -> setCheckState(0, Qt::Unchecked) ;

    for(int n = 0; n < n_rows; ++n)
        if(skkp_selection_model -> isRowSelected(n, QModelIndex()))
            variant_NS -> topLevelItem(0) -> child(n) -> setCheckState(0, Qt::Checked) ;
}

и

void PotokMainWindow::selected_SKP_Tree(int index )
{
    int n_rows = model_skkp -> rowCount() ;
    QItemSelectionModel* skkp_selection_model = skkp_view->selectionModel() ;

    for(int n = 0; n < n_rows; ++n)
        variant_NS -> topLevelItem(0) -> child(n) -> setCheckState(0, Qt::Unchecked) ;

    for(int n = 0; n < n_rows; ++n)
        if(skkp_selection_model -> isRowSelected(n, QModelIndex()))
            variant_NS -> topLevelItem(0) -> child(n) -> setCheckState(0, Qt::Checked) ;
}
« Последнее редактирование: Март 26, 2010, 10:51 от mark_o_polo » Записан
mark_o_polo
Гость
« Ответ #8 : Март 20, 2010, 17:25 »

skkp_view это QTableView
Записан
alexman
Гость
« Ответ #9 : Март 21, 2010, 20:49 »

Да, но заработало только когда я убрал аргументы, сейчас пустые скобки
Так это основа основ синтаксиса Qt Подмигивающий
Записан
alexman
Гость
« Ответ #10 : Март 21, 2010, 21:04 »

Например, соединяешь сигнал void clicked ( const QModelIndex & index ) из QAbstractItemView со слотом void treeClicked ( const QModelIndex & index ); а там выполняешь void QTableView::selectRow ( int row ). Что не понятно?
Записан
mark_o_polo
Гость
« Ответ #11 : Март 24, 2010, 09:47 »

да, спасибо, получается.

Делаю так
Код:
QItemSelectionModel* skkp_selection_model = variant_NS->selectionModel() ;

int n_rows = model_skkp -> rowCount() ;

skkp_view->clearSelection();

for(int n = 0; n<n_rows; ++n)
    if(variant_NS -> topLevelItem(0) -> child(n)->checkState(0) == Qt::Checked)
         skkp_view->selectRow(n);

но в таблице почему-то выделена только 1 строка с наибольшим номером n, все остальные не выделяются, хотя при выполнении цикла он проходит по всем ранее выделенным строкам. Почему в таблице отображается только одна выделенная? Как сделать, чтобы все отображались выделенными? 
Записан
mark_o_polo
Гость
« Ответ #12 : Март 26, 2010, 11:01 »

В приведенном в предыдущем посте цикле, selectRow(n) выполняется именно для тех n, которые соответсвуют отмеченным итемам в дереве. Но когда цикл проходит до конца, то в таблице отображается выделенной только одна строка, соответсвующая последнему значению  n, для которого было выполнено selectRow(n). Если убрать галочку в дереве с этого итема, то в таблице выделяется строка строка, соответсвующая бывшему предпоследнему, а, после снятия галки, последнему отмеченному итему в дереве.

Как сделать, чтобы в таблице были выделены - визуально! все строки, соотв. дереву?!! Непонимающий   
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 21.