Qt connect itemDoubleClicked на самоопределяемый слот

У меня есть следующий класс, который расширяет QListWidget, но я не могу соединить doubleClicked сигнал в слот, который я желаю. Вот реализованный код — в VS2012. Идея состоит в том, чтобы иметь возможность дважды щелкнуть элемент и редактировать его. Я подключаю сигнал к слоту в конструкторе, но слот никогда не вызывается, когда я запускаю его через отладчик.

# .h file
class DisplayFeed :
public QListWidget
{
Q_OBJECT
public:
DisplayFeed(QWidget *parent, Logic *logic, int xpos, int ypos, int width, int height, std::string color);
~DisplayFeed(void);
void setColor(std::string color);
void refresh(std::vector<Event*> *thingsToInclude);
private:
Logic* logic;
private slots:
void editItem(QEventStore *item);
};

Ниже находится файл .cpp. QEventStore продолжается QListWidgetItem, Я также разместил MessageBox для тестирования системы, на случай, если другой мой код не сработает.

# .cpp file, only relevant methods included
DisplayFeed::DisplayFeed(QWidget *parent, Logic *logic, int xpos, int ypos, int width, int height, std::string color)
: QListWidget(parent)
{
this->logic = logic;
setGeometry(xpos, ypos, width, height);
setColor(color);
QObject::connect(this, SIGNAL(itemClicked(QEventStore*)), this, SLOT(editItem(QEventStore*)));
show();
}

void DisplayFeed::editItem(QEventStore *item){
QMessageBox::information(this,"Hello!","You clicked \""+item->text()+"\"");
QEventEditor *editor = new QEventEditor(item->getEvent());
}

-1

Решение

Вы забыли Q_OBJECT макрос в вашем DisplayFeed учебный класс. Это должно быть как:

# .h file
class DisplayFeed :
public QListWidget
{
Q_OBJECT

public:
DisplayFeed(QWidget *parent, Logic *logic, int xpos, int ypos, int width, int height, std::string color);
~DisplayFeed(void);
void setColor(std::string color);
void refresh(std::vector<Event*> *thingsToInclude);
private:
Logic* logic;
private slots:
void editItem(QEventStore *item);
};

Это первое, что я заметил, и может решить вашу проблему. Если нет, я посмотрю глубже.

РЕДАКТИРОВАТЬ: прочитайте первый ответ здесь

0

Другие решения

Есть несколько изменений:

  1. добавлять Q_OBJECT в .час класса displayFeed

    class DisplayFeed : public QListWidget
    {
    Q_OBJECT
    ...
    };
    
  2. Измените свой слот с публичный слот и QListWidgetItem * параметр

    public slots:
    void editItem(QListWidgetItem *item);
    
  3. Соединиться с хорошим СИГНАЛ которые имеют тот же параметр, что ваш SLOT

    connect(this,SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,SLOT(editItem(QListWidgetItem*)));
    

Это прекрасно работает для меня, надеюсь, это поможет вам.

0

Я нашел ответ. Проблема в том, что сигнал по умолчанию для itemDoubleClicked испускает QListWidgetItem* и выделение подкласса этого не работает. Так что я должен был пойти в editItem и получить его для dynamic_cast QListWidgetItem* к QEventStore*

0
По вопросам рекламы [email protected]