Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Anarion от Февраль 28, 2010, 00:38



Название: И снова QTableWidget...
Отправлено: Anarion от Февраль 28, 2010, 00:38
Здравствуйте. В очередной раз пришлось работать с таблицами и возникли новые вопросы. Использую QTableWidget. Подскажите пожалуйста:
1) В свойствах QTableWidget можно установить флаг sortingEnabled, после чего можно сортировать таблицу по столбцам. Однако результат выглядит несколько странным:
(http://s002.radikal.ru/i199/1002/46/78d7cf7617ef.jpg)
Есть предположение, что сортировка производится по алфавиту. Есть ли возможность включить сортировку по значению? Сам реализовал путем записи таблицы в QList <double*> и сортирую, собственно, QList. Но время сортировки слишком великом (сравнил с Excel, тот почти мгновенно сортирует). Как вариант можно использовать лучший алгоритм, но интересно узнать, может встроена сортировка по значению.

2) Допустим, при двойном щелчке по ячейке, она (ячейка) переходит в режим редактирования. Не помню, где читал, но вроде в этот момент ячейка заменяется делегатом QLineEdit. Вопрос: можно ли получить указатель на этот виджет (QLineEdit), чтобы установить в него QDoubleValidator? По условиям работы в таблице могут быть только действительные числа (не строки и т.д.). Реализовал постпроверкой введенного значения, но валидатором, думаю, будет проще.

3) Есть ли в Qt готовая реализация методов Отменить/повторить для таблицы? Не то, чтобы я на столько ленив, что хочу использовать все готовые компоненты (для одной таблицы реализовал), но верится что умные люди, уже сделали и на много лучше.

PS: Уже не по таблицам вопрос :) Подскажите пожалуйста, каким образом можно получить состояние клавиш NumLock, ScrollLock и CapsLock в момент запуска программы? Хочу сделать в status bar индикаторы, как отображать при нажатии -знаю (но это уже флаг внутри программы), а вот про получение состояния этих кнопок в Qt найти информацию не смог.

PSS: Перед тем, как задать вопросы, я честно пытался сам разобраться...  :(


Название: Re: И снова QTableWidget...
Отправлено: Пантер от Февраль 28, 2010, 11:49
1. Используй связку модель -> QSortFilterProxyModel -> QTableView
2. Используй делегаты.
3. Qt's Undo Framework


Название: Re: И снова QTableWidget...
Отправлено: Anarion от Февраль 28, 2010, 12:40
Спасибо большое. Бум разбираться...


Название: Re: И снова QTableWidget...
Отправлено: voronElf от Март 01, 2010, 09:24
насчет CapsLock, я в обработчике события пользовался QKeyEvent::nativeModifiers (). Но событие от клавиатуры нужно.

А без события как считать находил кто-нибудь ?


Название: Re: И снова QTableWidget...
Отправлено: Anarion от Март 10, 2010, 17:32
Посмотрел на примере Notepad++ индикатор NumLock, выяснилось, что он меняется при нажатии клавиши только в том случае, когда активно окно самой программы. В общем, пришел к выводу, что текущее состояние не так важно.

Разрешите обратиться с новым вопросом по таблицам, точнее уже связанным с ней косвенно (думаю, что нет смысла создавать новые темы с вопросами, ответ на которые заключается в одном посте. Если неправ, пожалуйста поправьте).

Дошел наконец-то до делегатов. Хотел поместить в ячейки таблицы QDoubleSpinBox, чтобы сразу передать максимальное и минимальное допустимые значения, да и изменять удобно (работа с числами только). Возникла проблема в следующем:
разделителем в QDoulbeSpinBox установлена "," (запятая тобишь). Причем если бы только при начальном выводе, то ладно. Но ведь при наборе числа не дает ввести "." (точку), а хотелось бы использовать именно точку в качестве разделителя, т.к. куча данных в таблицах и прочих элемента выводятся через QString::number() с точкой. Да и привычнее. Предполагаю, что связано с установками знака разделителя, установленного в свойствах операционной системе. В примере из ассистенте есть пример:

Код:
 QLocale::setDefault(QLocale::C);
 d = QString("1234,56").toDouble(&ok);   // ok == false
 d = QString("1234.56").toDouble(&ok);   // ok == true, d == 1234.56

 QLocale::setDefault(QLocale::German);
 d = QString("1234,56").toDouble(&ok);   // ok == true, d == 1234.56
 d = QString("1234.56").toDouble(&ok);   // ok == true, d == 1234.56

Пробовал в конструкторе формы вызвать  QLocale::setDefault(QLocale::German); т.к. вроде оба разделителя понимает, но результат прежний - точку ставить не дает. В свойствах самого QDoubleSpinBox параметра, отвечающего за знак разделителя не нашел. Подскажите пожалуйста, можно ли каким-нибудь образом изменить знак разделителя?


Название: Re: И снова QTableWidget...
Отправлено: gil9red от Декабрь 23, 2012, 19:54
Наткнулся случайно, когда искал :)
Кроме этого:
1. Используй связку модель -> QSortFilterProxyModel -> QTableView
2. Используй делегаты.
3. Qt's Undo Framework

Есть другое решение, для сравнения значений :)
Переопределяем оператор сравнения < QTableWidgetItem и радуемся :)

У меня была сортировка чисел:
Код:
class UIntTableWidgetItem: public QTableWidgetItem
{
protected:
    virtual bool operator < (const QTableWidgetItem & other) const
    {
        qint32 a = text().toInt();
        qint32 b = other.text().toInt();
        return a < b;
    }
};

Так можно и вещественные числа сортировать и даты, и т.п. :)
Надеюсь, кому нибудь поможет :)


Название: Re: И снова QTableWidget...
Отправлено: Day от Декабрь 09, 2017, 13:40
Цитировать
Надеюсь, кому нибудь поможет
Хоть и через много лет, но кому-то помогло. Спасибо!:)


Название: Re: И снова QTableWidget...
Отправлено: gil9red от Декабрь 09, 2017, 19:51
Цитировать
Надеюсь, кому нибудь поможет
Хоть и через много лет, но кому-то помогло. Спасибо!:)

 ;)


Название: Re: И снова QTableWidget...
Отправлено: Day от Декабрь 09, 2017, 21:33
Можно немножко лирики?
Есть места, где на мои простые вопросы отвечают просто - "смотри Доку!" Да. Дока у Кути роскошная. И если знать, где искать, все можно найти. Но не всегда знаешь, что именно надо искать. А уж когда надо специальным образом что-то соединить...
Здесь мне ни разу не сказали - "смотри..." Если кто-то знает решение моего вопроса, или хотя бы намек, мне решат или намекнут. И сам я стараюсь в меру своих слабых сил...
Спасибо вам всем!