2015-11-15 2 views
1

Вот класс, который наследует от QListWidget:Унаследовав от QListWidget и его SLOT

typedef void(*fnc) (QListWidgetItem* item); 

class CustomListWidget : public QListWidget 
{ 
public: 
    CustomListWidget(); 
    void AddItemList(std::vector<std::string>* list); 
    void ConnectToOnClickSlot(fnc func); 
private: 
    fnc onClick; 
    void InvokeOnclickMethod(QListWidgetItem* item); 
}; 

Соответствующий .cpp файл (его часть):

CustomListWidget::CustomListWidget() 
{ 
    QObject::connect(this, SIGNAL(itemClicked(QListWidgetItem*)), 
        this, SLOT(InvokeOnclickMethod(QListWidgetItem*))); 
} 

void CustomListWidget::ConnectToOnClickSlot(fnc func) 
{ 
    onClick = func; 
} 

void CustomListWidget::InvokeOnclickMethod(QListWidgetItem* item) 
{ 
    onClick(item); 
} 

Я ожидал, что InvokeOnclickMethod быть вызывается при нажатии элементов, но ничего не происходит. Что может быть проблемой?

Основная часть:

auto listView = new CustomListWidget(); 
listView->ConnectToOnClickSlot(ItemClicked); 

void ItemClicked(QListWidgetItem* item) 
{ 
    //Do something... 
} 

ответ

3

Вам нужно добавить Q_OBJECT макрос для класса, в котором вы хотите использовать сигналы/слоты. IIRC, «старое» соединение также требует, чтобы слоты были объявлены в разделе <accessibility> slots:.

К сожалению, люди используют "new" signal/slot connection syntax около трех лет.

+0

Да, проблема решена. Кроме того, я пытался подключить ** простую функцию ** на первом месте. Таким образом, вы ответили больше, чем мой вопрос. – ozgur

+0

Добро пожаловать. – LogicStuff

Смежные вопросы