У меня есть следующий класс, который расширяет 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());
}
Вы забыли 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);
};
Это первое, что я заметил, и может решить вашу проблему. Если нет, я посмотрю глубже.
РЕДАКТИРОВАТЬ: прочитайте первый ответ здесь
добавлять Q_OBJECT в .час класса displayFeed
class DisplayFeed : public QListWidget
{
Q_OBJECT
...
};
Измените свой слот с публичный слот и QListWidgetItem * параметр
public slots:
void editItem(QListWidgetItem *item);
Соединиться с хорошим СИГНАЛ которые имеют тот же параметр, что ваш SLOT
connect(this,SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,SLOT(editItem(QListWidgetItem*)));
Это прекрасно работает для меня, надеюсь, это поможет вам.
Я нашел ответ. Проблема в том, что сигнал по умолчанию для itemDoubleClicked
испускает QListWidgetItem*
и выделение подкласса этого не работает. Так что я должен был пойти в editItem
и получить его для dynamic_cast QListWidgetItem*
к QEventStore*