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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget: не вызывается слот по сигналу itemDoubleClicked  (Прочитано 5287 раз)
cresta
Гость
« : Март 08, 2009, 07:09 »

.h:

Цитировать
void   tvDblClicked(QTreeWidgetItem *item, int col);

.cpp:

Цитировать
void MainWin::createTreeWidget(){
    QTreeWidgetItem *tv = new QTreeWidgetItem(...);
    ...
    QObject::connect(tv, SIGNAL(itemDoubleClicked (QTreeWidgetItem *, int)), this, SLOT(tvDblClicked(QTreeWidgetItem *, int)));
    ...
}


void MainWin::tvDblClicked(QTreeWidgetItem *item, int col){
   qDebug("aaaaaaaaaaaaaaaaaaaa");
   if ( item->childCount () ){
      if ( item->isExpanded() ) item->setExpanded(false);
      else item->setExpanded(true);
   }
   else{

   }
}


Слот не вызывается.
Компиляция без ошибок, при двойном клике на итемах TreeWidget никаких сообщений от QObject (не найден слот и т.п.) нет. Всё как бы правильно, только не работает. Ставил бряк на вход слота - слот не вызывается.
В чем может быть проблема?
Другой сигнал - itemSelectionChanged() нормально вызывается.


P.S.
Сейчас заметил, что не срабатывает для root-итемов, которые имеют дочерние итемы.
Для самих child'ов слот вызывается.
« Последнее редактирование: Март 08, 2009, 07:15 от cresta » Записан
BRE
Гость
« Ответ #1 : Март 08, 2009, 09:22 »

Цитировать
void MainWin::createTreeWidget(){
    QTreeWidgetItem *tv = new QTreeWidgetItem(...);
Тут наверно все таки new QTreeWidget( ... )?

Сейчас заметил, что не срабатывает для root-итемов, которые имеют дочерние итемы.
Для самих child'ов слот вызывается.
Стандартное поведение: при двойном клике происходит разворачивание/сворачивание ветки.
Если сделаешь tv->setExpandsOnDoubleClick ( false ), будешь получать сигнал.
Записан
cresta
Гость
« Ответ #2 : Март 08, 2009, 13:30 »

Ну да, QTreeWidget Улыбающийся Ну в общем вы поняли.

Что-то setExpandsOnDoubleClick не очень помогает.

Я извиняюсь, наверное не полную информацию дал:
Root-итемы имеют свойство setFirstColumnSpanned(true) и width root-итемов сделано достаточно маленьким. Это сделано, чтобы избавиться от длинных пунктирных линий, появляющихся при раскрытии root-итема. Т.о. куда бы ни тыкали мышью, попадаем не в сам итем (column 0), а в этот вот spanned итем. Если прицелиться и попасть именно в маленький промежуток, соответствующий именно column 0, то сигнал проходит. По всей остальной ширине (там где spanned) сигнал не проходит.

Вот код создания полностью:
Код:
void MainWin::createTreeWidget(){
    QColor color1 = QColor(230,230,235);
    QColor color2 = QColor(250,250,255);
    bool parity;

    /* tree widget creation */
    tv = new QTreeWidget(this);
    tv->setColumnCount(6);
    tv->setExpandsOnDoubleClick ( false );

    QObject::connect(tv, SIGNAL(itemSelectionChanged()), this, SLOT(tvSelChanged()));
    QObject::connect(tv, SIGNAL(itemDoubleClicked (QTreeWidgetItem *, int)), this, SLOT(tvDblClicked(QTreeWidgetItem *, int)));

    QStringList hdrLabels;
    hdrLabels << tr("hdr0") << tr("hdr1") << tr ("hdr2") << tr("hdr3") << tr("hdr4") << tr("hdr5");
    tv->setHeaderLabels(hdrLabels);
    QHeaderView *hdr = tv->header();
    QFont font(hdr->font());
    font.setBold(true);
    hdr->setFont(font);
    hdr->setDefaultAlignment(Qt::AlignCenter);

    /* fill tree widget with data */
    QTreeWidgetItem *catItem, *subItem;
    QSqlQuery queryCat, queryProd;
    int cnt=0;

    queryCat.exec("SELECT DISTINCT code FROM table2");
    qDebug ("records count %d", queryCat.size());
    queryCat.exec("SELECT DISTINCT category FROM table2 ORDER BY category ASC");
    while (queryCat.next()) {
        /* category root item*/
        QString value = queryCat.value(0).toString();
        catItem = new QTreeWidgetItem((QTreeWidget*)0, QStringList(value));
        tv->insertTopLevelItem(cnt, catItem);
        catItem->setTextColor(0,QColor(0,70,120));
        catItem->setFont(0, font);
        catItem->setFirstColumnSpanned(true);
        parity=true;
        queryProd.exec("SELECT code, product, unit, outprice, count FROM table2 WHERE category = '"+value+"' ORDER BY product ASC ");
        while ( queryProd.next() ){
            subItem = new QTreeWidgetItem((QTreeWidget*)0, 0);
            catItem->addChild(subItem);
            for (int i = 0; i < 5; ++i){
            if (parity) subItem->setBackgroundColor(i+1,color1);
            else subItem->setBackgroundColor(i+1,color2);

            subItem->setText(i+1, queryProd.value(i).toString());
            subItem->setTextAlignment(i+1, colAlign[i]);
        }
        parity = !parity;
    }
    /* insert dummy subItem */
    subItem = new QTreeWidgetItem((QTreeWidget*)0, 0);
    catItem->addChild(subItem);
    cnt ++;
}

P.S.
Если убрать свойство spanned, то сигнал проходит при клику на любом месте итема. Но при этом текст в колонке 0 практически не виден (только одна буква)

« Последнее редактирование: Март 08, 2009, 13:39 от cresta » Записан
cresta
Гость
« Ответ #3 : Март 08, 2009, 13:57 »

Это рисунок со свойством spanned. Если попасть именно в букву А в слове Аккумуляторы, то сигнал проходит.
По всей остальной ширине сигнал не проходит




А это с отключенным spanned. Здесь сигнал проходит при клике на любом месте, по всей ширине.
Но первой колонки не видно. Если делать широкую первую колонку, то вылазят пунктирные линии, а это мне не нравится.
« Последнее редактирование: Март 08, 2009, 14:02 от cresta » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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