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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: И снова QTableWidget...  (Прочитано 9533 раз)
Anarion
Гость
« : Февраль 28, 2010, 00:38 »

Здравствуйте. В очередной раз пришлось работать с таблицами и возникли новые вопросы. Использую QTableWidget. Подскажите пожалуйста:
1) В свойствах QTableWidget можно установить флаг sortingEnabled, после чего можно сортировать таблицу по столбцам. Однако результат выглядит несколько странным:

Есть предположение, что сортировка производится по алфавиту. Есть ли возможность включить сортировку по значению? Сам реализовал путем записи таблицы в QList <double*> и сортирую, собственно, QList. Но время сортировки слишком великом (сравнил с Excel, тот почти мгновенно сортирует). Как вариант можно использовать лучший алгоритм, но интересно узнать, может встроена сортировка по значению.

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

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

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

PSS: Перед тем, как задать вопросы, я честно пытался сам разобраться...  Грустный
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 28, 2010, 11:49 »

1. Используй связку модель -> QSortFilterProxyModel -> QTableView
2. Используй делегаты.
3. Qt's Undo Framework
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Anarion
Гость
« Ответ #2 : Февраль 28, 2010, 12:40 »

Спасибо большое. Бум разбираться...
Записан
voronElf
Гость
« Ответ #3 : Март 01, 2010, 09:24 »

насчет CapsLock, я в обработчике события пользовался QKeyEvent::nativeModifiers (). Но событие от клавиатуры нужно.

А без события как считать находил кто-нибудь ?
Записан
Anarion
Гость
« Ответ #4 : Март 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 параметра, отвечающего за знак разделителя не нашел. Подскажите пожалуйста, можно ли каким-нибудь образом изменить знак разделителя?
« Последнее редактирование: Март 10, 2010, 18:11 от Anarion » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Декабрь 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;
    }
};

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

Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #6 : Декабрь 09, 2017, 13:40 »

Цитировать
Надеюсь, кому нибудь поможет
Хоть и через много лет, но кому-то помогло. Спасибо!:)
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Декабрь 09, 2017, 19:51 »

Цитировать
Надеюсь, кому нибудь поможет
Хоть и через много лет, но кому-то помогло. Спасибо!:)

 Подмигивающий
Записан

Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #8 : Декабрь 09, 2017, 21:33 »

Можно немножко лирики?
Есть места, где на мои простые вопросы отвечают просто - "смотри Доку!" Да. Дока у Кути роскошная. И если знать, где искать, все можно найти. Но не всегда знаешь, что именно надо искать. А уж когда надо специальным образом что-то соединить...
Здесь мне ни разу не сказали - "смотри..." Если кто-то знает решение моего вопроса, или хотя бы намек, мне решат или намекнут. И сам я стараюсь в меру своих слабых сил...
Спасибо вам всем!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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