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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Что использовать?  (Прочитано 8257 раз)
dont
Гость
« : Апреля 07, 2006, 14:15 »

Стал я значит перед такой проблемой:
есть большая таблица(>50 столбцов), нужно сделать что то на подобие меню, что бы пользователь мог выбрать(ну типа пометить галочками) определенные столбци. Какие элементы для этого лучше юзать? Пробывал в меня все это всунуть, понял что гон, да и кутэ дизайнер только 25 нормально добавляет... Думал может КомбоБокс, но мну нужно, что бы пользователь мог отмечать галочками поля...
Подскажите плз, а то на групы разбивать низя, говорили так нужно сделать....
Записан
Steven_Orko
Гость
« Ответ #1 : Апреля 07, 2006, 23:43 »

Мда... очень "хорошая" формулировка вопроса...Какой вопрос, такой и ответ... используй собственный виджет, который позволит тебе иметь 50 QCheckBox или QListWidget со вставленными в него QCheckBox... Аж целых 50 штук можно... а проверять... ну, там уж есть такое PROPERTY:

          checked : bool
          This property holds whether the button is checked.
          Only checkable buttons can be checked. By default, the button is           unchecked.
          Access functions:

          bool isChecked () const
          void setChecked ( bool )
Записан
dont
Гость
« Ответ #2 : Апреля 08, 2006, 00:14 »

Как мне намутить собственный виджет и вставить в него чекбоксы? Как проверять, я знаю.
Хорошо, попробую еще раз объясниться. Есть в роле центрального виджета таблица, число столбцов которой должно меняться в зависимости от желаний пользователя...
Какой виджет использовать для того, что бы пользователь мог удобно выбирать, какие столбцы он хочет видеть?
Записан
Steven_Orko
Гость
« Ответ #3 : Апреля 09, 2006, 01:01 »

Ну, например, можно сделать что-то вроде  диалога с панелью инструментов, в роле одного из инструментов будет кнопка конфигурации. Пользователь жмет на нее, появляется модальный диалог с QListWidget, в котором будет 50 QCheckBox. Как вставить в него QCheckBox подробнее см. Assistat, начни с функции setItemWidget():

void QListWidget::setItemWidget ( QListWidgetItem * item, QWidget * widget )
Sets the widget to be displayed in the give item.
This function should only be used to display static content in the place of a list widget item. If you want to display custom dynamic content or implement a custom editor widget, use QListView and subclass QItemDelegate instead.
This function was introduced in Qt 4.1.


Так вот.... Пользователь отмечает там галочками те столбцы, которые он хочет видеть, и нажимает ОК... Ты после выхода из exec вызываешь что-то наподобии функции:
QStringList selectedColumns() const.
Эта функция написана тобой. В ней ты проверяешь все отмеченные QCheckBox и возвращаешь названия столбцов в виде списка строк... Ну, а дальше сам знаешь, что делать...
Код примерно такой.

Роли исполяют:
 - My_Conf - класс диалогового окна со списком QCheckBoxes;
 - My_Form - твоя форма (класс) с таблицей основной.
 
Код:

void My_Form::onButtonConfClicked()
{
    My_Conf conf; //Если вызывается нечасто, то можно и так...
    conf.exec();
    QStringList lst = conf.selectedColumns();
    //Твои действия по отображению только выбранных столбцов
}
Записан
dont
Гость
« Ответ #4 : Апреля 09, 2006, 01:30 »

спасибо, добрый человек!

Только еще один вопрос:
пользователь очень часто будет обращаться к выбору столбцов, нельзя ли сделать так, что бы этот ЛистВиджет показывался как контекстное меню, или что-то в этом роде, просто каждый раз открывать диалоговое окно геморно очень...

И еще, есть такая же проблема с QTableView, нужно замутить некоторые ячейки опять же с тем ЧекБоксом, на подобие Эксесса. Что бы пользователь мог отметить нужные ему записи, а потом уже экспорт в Эксесс или сразу на печать(ну с этим я сам розберусь, интересует как вставить чекбоксы в ячейки таблицы...)
Записан
danius
Гость
« Ответ #5 : Апреля 09, 2006, 09:02 »

Обычно в таких случаях поступают так: два QListView (QListWidget), в правом все доступные поля таблицы, а в левом те которые ты хочешь отображать. Посередине ставишь кнопки со стрелками <- ->, а так же я полагаю ты хотел бы менять положение отображаемых полей так, что еще пара кнопок вверх и вниз. А еще лучше подумать о Drug'n'Drop.

ЗЫ. Таблица с 50 полями Грустный подумай может стоить разбить на несколько.
Записан
Steven_Orko
Гость
« Ответ #6 : Апреля 09, 2006, 14:33 »

Цитата: "dont"
спасибо, добрый человек!

Только еще один вопрос:
пользователь очень часто будет обращаться к выбору столбцов, нельзя ли сделать так, что бы этот ЛистВиджет показывался как контекстное меню, или что-то в этом роде, просто каждый раз открывать диалоговое окно геморно очень...


Давай подумаем вместе... Диалоговое окно открывать часто очень геморно, да и к тому же догло именно тем спсобом, что я тебе описал. Для ускорения необходимо создать динамически в памяти, а при выходе (закрытии формы) прибить...

Далее... Ты сам сказал, что столбцов у тебя 50. Представь себе онтекстное меню с 50ью  элементами? Это ОЧЕНЬ напряжно для пользователя...

Очень хороший метод решения предложил danius, но как ты говорил, этот диалог вызывается часто... (Хотя я не могу понять, зачем так часто...) Раз так, то можно сделать контекстное меню для всей таблицы, при его открытии до того, как оно будет показано формировать пункты меню. Например, Будут отображаться две части в меню... первая - какие солбцы скрыть, вторая - какие столбцы показать... Ну, нулевой пункт можно сделать "Скрыть текущий столбцец"... имеется ввиду тот, на котором пользователь нажал кнопку вызова контекстного меню...

Цитата: "dont"
нельзя ли сделать так, что бы этот ЛистВиджет показывался как контекстное меню, или что-то в этом роде


В принципе, чисто теоритически это сделать можно... Но ты представляешь как? Например, тебе обычному виджету нужно дать поведение контекстного меню.... Возможно Dendy меня поправит, но я не знаю ни одного такого виджета в текущем последнем Qt FrameWork, а потому тебе придется самому все это делать... Как минимум, тебе надо будет отслеживать положения мыши, состояние ее кнопок, чтобы вовремя убрать/показать виджет... Как максимум, придется еще переписать член-функцию exec... При этом ты можешь использовать только средства Qt FrameWork, если, конечно, тебе нужна кроссплатформенность. )))

Цитата: "dont"
И еще, есть такая же проблема с QTableView, нужно замутить некоторые ячейки опять же с тем ЧекБоксом, на подобие Эксесса. Что бы пользователь мог отметить нужные ему записи, а потом уже экспорт в Эксесс или сразу на печать(ну с этим я сам розберусь, интересует как вставить чекбоксы в ячейки таблицы...)


Для QTableView почти не как... для этого надо делать свою модель данных... Так как QTableView - это всего лишь View... Подробнее смотри статью Model/View Programming.
Записан
crocus
Гость
« Ответ #7 : Апреля 09, 2006, 18:22 »

А еще можно сделать мультиселекторный QListView c именами столбцов  и по факту селекта-деселекта
Код:

tableView->setColumnHidden ( 18, true );
Записан
dont
Гость
« Ответ #8 : Апреля 11, 2006, 00:14 »

Всем спасибо... :wink:
Записан
mindz_eye
Гость
« Ответ #9 : Апреля 12, 2006, 17:42 »

Цитата: "dont"
интересует как вставить чекбоксы в ячейки таблицы


Как вариант, ты можешь переопределить paint класса QItemDelegate и в нем отрисовывать чекбокс, с помощью метода drawCheck. Чтобы чекбоксы реагировали на клики мышкой, переопределяешь editorEvent.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Апреля 12, 2006, 17:49 »

http://hardclub.donntu.edu.ua/projects/qt/components/vbrowser2.htm

это зло
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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