继承自 QListWidget 及其 SLOT

Inheriting from a QListWidget and its SLOT

这里是继承自QListWidget的class:

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...
}

您需要为要使用 signals/slots 的 class 添加 Q_OBJECT 宏。 IIRC,"old" 连接还需要在 <accessibility> slots: 部分中声明插槽。

顺便说一句,人们已经使用 "new" signal/slot connection syntax 大约三年了。