Название: Выбранный элемент в QTreeWidget и сортировка
Отправлено: 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"?
Название: Re: Выбранный элемент в QTreeWidget и сортировка
Отправлено: neversleep от Февраля 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); }
Но ИМХО надо искать другие способы.
Название: Re: Выбранный элемент в QTreeWidget и сортировка
Отправлено: White Owl от Февраля 10, 2012, 19:23
model()->blockSignals() просто отменяет авто-сортировку на момент изменения текстов... В принципе, я думаю что такое решение вполне годится. Если мы правим названия элементов а они при этом остаются на своих местах... с точки зрения удобства это очень даже неплохо. А если отредактировав много разных элементов мы таким образом "нарушили" сортировку, то "восстановить" ее может один клик по заголовку колонки... Я думаю что это вполне приемлемо. Спасибо за подсказку.
|