Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 05.05.2019
Сообщений: 4
1

Вызов createEditor по наведению курсора мыши, а не по двойному клику

10.07.2019, 18:27. Показов 1104. Ответов 3
Метки qt (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть модель в которой хранятся данные о виджетах. Мой delegate отрисовывает эти виджеты, например, checkbox. При дабл клике для этого чекбокса создается editor. Как сделать так, чтобы эдитор создавался не при двойном клике, а при наведении курсора мыши на виджет?

Прикладываю editor.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
QWidget *ListModelDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    switch(index.data(TypeRole).toInt())
    {
        case Checkbox:{
            QCheckBox *editor = new QCheckBox(parent);           
            return editor;
        }
 
        case Button:{
            QPushButton *editor = new QPushButton(parent);        
            return editor;
        }
        default: return parent;
    }
}
 
 
void ListModelDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    switch(index.data(TypeRole).toInt())
    {
        case Checkbox:{
            QCheckBox *checkbox = static_cast<QCheckBox*>(editor);
            assembleCheckbox(*checkbox,index);
            break;
        }
        case Button:{
            QPushButton *button = static_cast<QPushButton*>(editor);
            assembleButton(*button,index);
            break;
        }
    }
}
 
 
void ListModelDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}
 
 
void ListModelDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    switch(index.data(TypeRole).toInt())
    {
        case Checkbox:{
        QCheckBox *checkbox = static_cast<QCheckBox*>(editor);
        Qt::CheckState state = checkbox->checkState();
        model->setData(index,state,Qt::EditRole);
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2019, 18:27
Ответы с готовыми решениями:

Сделать эффект отлипания курсора от окна по двойному клику
Помогите сделать эффект отлипания курсора от окна по двойному клику. Эффект прилипания я сделал, а...

Как скопировать данные по двойному клику мыши
Добрый вечер! Может быть кто-нибудь поможет подправить код в VB? Нужно, чтобы при двойном клике...

По двойному клику мыши изменить местоположение формы
Здравствуйте Это моя первая программа на с# помогите пожалуйста разобраться новичку в с# напишите...

Копирование данных с нескольких листов с по двойному клику мыши
Помогите написать макрос для копирования данных в лист &quot;Заказ&quot; по двойному клику мыши по цене товара

3
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
10.07.2019, 18:38 2
Velklish, эдитор это ты о своем другой окне?

Тебе нужной сделать свой класс (наследник QCheckBox) в котором переопределить двойное нажатия и наведения курсора мыши, как только ты переопределил дабл клик, у тебя уже ничего работать не будет, т.к. этот ивент виртуальный и не будет вызыватся в супер-классе (родительском), а методе который переопределяет наведения курсора, вызывать действия для показа эдитора
0
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
11.07.2019, 13:48 3
Если хочешь изменить поведение виджета, перегружай в подклассе от него соответствующий обработчик события.

Я бы отладчиком нашла то место, где вызывается createEditor() и сделала по образу и подобию свой собственный вызов. Скорей всего, у вьювера надо будет установить NoEditTrogger.
0
0 / 0 / 0
Регистрация: 05.05.2019
Сообщений: 4
12.07.2019, 14:15  [ТС] 4
Я унаследовал класс от QListView и переопределил mouseMoveEvent. Вроде работает, надеюсь кому-то поможет.
Вот что получилось:

header
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef CUSTOM_VIEW_H
#define CUSTOM_VIEW_H
 
 
#include <list_model.h>
 
#include <QtWidgets>
#include <QListView>
 
class CustomListView : public QListView
{
public:
    CustomListView();
    QModelIndex previousIndex;
 
protected:
    virtual void mouseMoveEvent(QMouseEvent *event) override;
 
};
 
 
 
#endif // CUSTOM_VIEW_H

.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "custom_listview.h"
 
CustomListView::CustomListView()
{
 
}
 
 
void CustomListView::mouseMoveEvent(QMouseEvent *event)
{
    QModelIndex currentIndex = indexAt(event->pos());
 
    if (currentIndex.isValid())
    {
        if (!previousIndex.isValid())
        {
            previousIndex=currentIndex;
        }
        else if (previousIndex.isValid() && (previousIndex != currentIndex))
        {
            closePersistentEditor(previousIndex);
            openPersistentEditor(currentIndex);
            previousIndex=currentIndex;
        }
     }
}
0
12.07.2019, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2019, 14:15
Помогаю со студенческими работами здесь

Выполнение команды "Вставить текст" по двойному клику левой кнопкой мыши
Всем, привет. Подскажите, пожалуйста, как сделать что бы в поле ввода или документе, можно было...

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

Вызов контекстого меню по клику правой кнопкой мыши Windows Explorer
Уважаемые участники подскажите как организовать : Получение пути файла (например MP3 файл)...

Создание подсказки по наведению курсора
При наведении курсора мыши на ссылку, как сделать подсказку , содержащую несколько строк Спасибо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru