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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выбранный элемент в QTreeWidget и сортировка  (Прочитано 3464 раз)
White Owl
Гость
« : Февраль 10, 2012, 01:57 »

Qt 4.8.0

Код:
#include <QtGui>

class TestWindow: public QWidget {
Q_OBJECT
QLabel *lblPrev, *lblCurr;
QTreeWidget *tree;

public:
TestWindow(QWidget *parent=0);
private slots:
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
};

Код:
#include "TestWindow.h"

TestWindow::TestWindow(QWidget *parent) : QWidget(parent) {

tree = new QTreeWidget();
tree->setSortingEnabled(true);

QTreeWidgetItem *twi;
twi = new QTreeWidgetItem();
twi->setText(0,"a");
tree->addTopLevelItem(twi);

twi = new QTreeWidgetItem();
twi->setText(0,"b");
tree->addTopLevelItem(twi);

lblPrev = new QLabel("previous");
lblCurr = new QLabel("current");

QVBoxLayout *vlayout = new QVBoxLayout();
QHBoxLayout *hlayout = new QHBoxLayout();
vlayout->addWidget(tree);
hlayout->addWidget(lblPrev);
hlayout->addWidget(lblCurr);
vlayout->addLayout(hlayout);
this->setLayout(vlayout);


connect(tree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
        this, SLOT(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
tree->setCurrentItem(tree->topLevelItem(0));

}

void TestWindow::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) {
if(previous) {
if(previous->text(0) == "a") previous->setText(0, "c");
lblPrev->setText(previous->text(0));
} else {
lblPrev->setText("NULL");
}

if(current)  {
lblCurr->setText(current->text(0));
} else {
lblCurr->setText("NULL");
}
}

На старте имеем выбранный элемент b, в метках: NULL/b. Кликаем по строке "a" в метках b/a. Пока все хорошо.
А теперь тыкаем в b, получаем "c" и "b" строки и c/b в метках. Но! "b" окружена пунктирной линией а синим выбрана "c".

Спрашивается, кто виноват, что делать и вообще? Как сделать чтобы при клике на "b" и пересортировке либо синее выделение следовало за "b", либо current получал значение "c" а не "b"?
Записан
neversleep
Гость
« Ответ #1 : Февраль 10, 2012, 05:49 »

Qt 4.7.4 / win7, тоже самое. С помощью грубой силы добился чтобы "синее выделение следовало за "b"":
Код
C++ (Qt)
void TestWindow::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) {
   const bool sb = tree->model()->blockSignals(true);
   ...
   tree->model()->blockSignals(sb);
}
 
Но ИМХО надо искать другие способы.
Записан
White Owl
Гость
« Ответ #2 : Февраль 10, 2012, 19:23 »

model()->blockSignals() просто отменяет авто-сортировку на момент изменения текстов...
В принципе, я думаю что такое решение вполне годится. Если мы правим названия элементов а они при этом остаются на своих местах... с точки зрения удобства это очень даже неплохо. А если отредактировав много разных элементов мы таким образом "нарушили" сортировку, то "восстановить" ее может один клик по заголовку колонки... Я думаю что это вполне приемлемо.
Спасибо за подсказку.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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