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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Выпадающее меню на HeaderView с перечнем чекбоксов с названиями колонок  (Прочитано 13775 раз)
stealth
Гость
« : Сентябрь 18, 2007, 11:32 »

Доброго дня!
Собственно сабж! Как делается на TableView такая штука, чтобы пользователь мог влючить или отключить показ колонок в таблице?
« Последнее редактирование: Сентябрь 18, 2007, 11:37 от stealth » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Сентябрь 18, 2007, 11:48 »

Конекти клик по HeaderView (ссылку на него можно достать из TableView) с функцией, которая будет создавать менюху. Потом hideColumn(int). В чем вообще проблема?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
stealth
Гость
« Ответ #2 : Сентябрь 18, 2007, 11:51 »

Как выловить клик по хедеру - это понятно, а вот как эту менюшку сделать такую? 
Записан
EhTemka
Гость
« Ответ #3 : Сентябрь 18, 2007, 13:10 »

Зделай контекстное меню, так проще Улыбающийся
Записан
stealth
Гость
« Ответ #4 : Октябрь 17, 2007, 22:43 »

   Реализую функцию, которая бы генерировала менюшку.
   Вот произошел затык ;( Знаю, что передавать параметры в слоты нельзя, но специально пишу заведомо не рабочий код коннекта сигнала, т.к. логически понятно что я хочу получить.
   Как сделать эту конструкцию правильной?

   На входе функции model и tableView для неё.

 
Код:
   int i;
    for (i=0; i< model->columnCount(); i++) {

        QAction *action = new QAction(model->headerData(i, Qt::Horizontal).toString() , this);
        action->setCheckable(true);
        if (!ui.tableView->isColumnHidden(i))
            action->setChecked(true);
        // connect( action, SIGNAL( triggered() ),  ui.tableView, SLOT( hideColumn (i) ) ); - нужен рабочий аналог!!!!!!

ui.tableView->horizontalHeader()->addAction(action);

    }
    ui.tableView->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

Спасибо за советы!
Записан
Вячеслав
Гость
« Ответ #5 : Октябрь 17, 2007, 22:59 »

QSignalMapper не катит ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #6 : Октябрь 18, 2007, 01:13 »

QActionGroup?
Записан

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 не волк, в лес не уйдёт
Kainit
Гость
« Ответ #7 : Октябрь 18, 2007, 09:09 »

В рамках приведённого фрагмента кода можно сделать не очень симпатично, но вполне разумно

т.е., немного схитрим в реализации (но гарантируя что сендерами сигналов будут только QAction-ы)

Код:
MyTableView::hideColumn () 
{
    QAction*action = qobject_cast<QAction*>sender();  // собственно, дальше можно и не писать, думаю что способ понятен

    if(!action ->isChecked ())
        HideColumn(action->text()); // это другой метод который предстоит реализовать, принимает строку имени колонки...
    else
       ShowColumn(action->text());
}

1. Я не предлагаю реализивывать скрытие и появление колонок 2-мя методами, разумнее сделать 1
2. Предлагаемый способ не очень красив, т.к. требует жесткого сендера...
« Последнее редактирование: Октябрь 18, 2007, 09:13 от Kainit » Записан
stealth
Гость
« Ответ #8 : Октябрь 18, 2007, 17:37 »

действительно для этой цели везде рекомендуют синалМаппер, но что-то у меня ничего не происходит, никаких сообщений тоже не вылазиет.
Код:
int i;
    QMenu *columnsMenu= new QMenu(tr("Колонки"));
    columnsMenu->setIcon(QIcon(":images/images/configure.png"));
    QSignalMapper *signalMapper;
    signalMapper = new QSignalMapper(this);

    for (i=0; i< modelNedw->columnCount(); i++) {

        QAction *action = new QAction(modelNedw->headerData(i, Qt::Horizontal).toString() , this);
        action->setCheckable(true);
        if (!ui.tableView->isColumnHidden(i))
            action->setChecked(true);
        connect(action, SIGNAL(triggered()), signalMapper, SLOT(map()));
        signalMapper->setMapping(action, ui.tableView->isColumnHidden(i));

        connect(signalMapper, SIGNAL(mapped(int)),
                ui.tableView, SLOT(hideColumn(int)));
        columnsMenu->addAction(action);

    }
    QMenu *headerMenu= new QMenu;
    ui.tableView->horizontalHeader()->addAction(headerMenu->addMenu(columnsMenu));
    ui.tableView->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);
Что может быть не так?
Записан
Вячеслав
Гость
« Ответ #9 : Октябрь 19, 2007, 10:56 »

        signalMapper->setMapping(action, ui.tableView->isColumnHidden(i));
Что может быть не так?
Эт шо ?
Код:
void setMapping ( QObject * sender, int id ) 
void setMapping ( QObject * sender, const QString & text )
void setMapping ( QObject * sender, QWidget * widget )
void setMapping ( QObject * sender, QObject * object )
Таки может

signalMapper->setMapping(action, i); ?
Записан
stealth
Гость
« Ответ #10 : Октябрь 19, 2007, 19:05 »

Вячеслав, спасибо за помощь!
Действительно колонки стали убираться.
Но тут опять засада Улыбающийся Убираться-то они убираются (через hideColumn), а ведь еще нужно чтобы появлялись... а это надо вызывать уже showColumn. Как же завязать bool значение triggered(bool) от action`a на скрытие и раскрытие ума не приложу

to Racheengel - а как этот ActionGroup может помочь?
to Kainit - переопределять ничего не хотелось бы, ведь нужно чтобы это была функция, которую можно будет прилепить к любому QTableView
« Последнее редактирование: Октябрь 19, 2007, 19:08 от stealth » Записан
ритт
Гость
« Ответ #11 : Октябрь 19, 2007, 22:24 »

setColumnHidden(int, bool) не поможет?
Записан
stealth
Гость
« Ответ #12 : Октябрь 20, 2007, 09:59 »

Если бы знать еще как его прикрутить Улыбающийся
Записан
stealth
Гость
« Ответ #13 : Октябрь 22, 2007, 20:12 »

Насколько я заметил - ни в одной KDE`ной проге нет реализации такой вот с виду простой штуки. В Amarok например появляется пункт меню "Скрыть колонку" и "Показать меню -> [Список скрытых колонок]"
В konqueror примерно тоже самое, через отдельный диалог с ListWidget`ом. Вообщем везде жутко неудобно!
В виндовом Explorer однако такая штука есть и работает отлично... Обидно Грустный

Записан
ритт
Гость
« Ответ #14 : Октябрь 22, 2007, 22:55 »

у меня в проекте сейчас реализовано то, о чём ты говоришь. плюс данное меню с тиарОфф. всё красиво и юзабельно...пока кол-во столбцов не превышает определённый лимит = (высота экрана/высоту элемента меню) - что-то порядка двадцати - двадцати пяти пунктов меню. если превышает, вся юзабельность превращается в напряг, особенно при включенном тиарОфф!

решил избавиться от этой менюхи в пользу доклета с ЛистВиджетом.

если у тебя столбцов мало, проблемы нет.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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