Qt将itemDoubleClicked连接到自定义插槽

时间:2014-10-14 03:22:12

标签: c++ qt qlistwidget qlistwidgetitem

我有以下扩展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());
}

3 个答案:

答案 0 :(得分:0)

您忘记了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);
};

这是我注意到的第一件事,可能会解决您的问题。如果不是,我会更深入。

编辑:阅读first answer here

答案 1 :(得分:0)

要做几处更改:

  1. 在displayFeed类的 h 中添加 Q_OBJECT

    class DisplayFeed : public QListWidget
    {
        Q_OBJECT
        ...
    };
    
  2. 使用公共广告位 QListWidgetItem * 参数

    更改广告位
    public slots:
        void editItem(QListWidgetItem *item);
    
  3. 使用与 SLOT

    相同的参数 SIGNAL 连接
    connect(this,SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,SLOT(editItem(QListWidgetItem*)));
    
  4. 这对我来说很好,希望它可以帮助你。

答案 2 :(得分:0)

我找到了答案。问题是itemDoubleClicked的默认信号会发出QListWidgetItem*并发出一个不起作用的子类。所以我要做的就是转到editItem然后将QListWidgetItem*动态广播到QEventStore*