-1

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

3 回答 3

0

有几个改变要做:

  1. . _ displayFeed 类的h

    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*)));
    

这对我来说很好,希望对你有帮助。

于 2014-10-14T07:23:45.080 回答
0

我找到了答案。问题是itemDoubleClicked发出的默认信号QListWidgetItem*和发出它的子类不起作用。所以我要做的就是去editItem把它动态转换QListWidgetItem*成一个QEventStore*

于 2014-10-15T17:45:29.970 回答
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);
};

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

编辑:在这里阅读第一个答案

于 2014-10-14T03:26:38.803 回答