我有以下扩展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());
}
答案 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)
在displayFeed类的 h 中添加 Q_OBJECT
class DisplayFeed : public QListWidget
{
Q_OBJECT
...
};
使用公共广告位和 QListWidgetItem * 参数
更改广告位public slots:
void editItem(QListWidgetItem *item);
使用与 SLOT
相同的参数 SIGNAL 连接connect(this,SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,SLOT(editItem(QListWidgetItem*)));
这对我来说很好,希望它可以帮助你。
答案 2 :(得分:0)
我找到了答案。问题是itemDoubleClicked
的默认信号会发出QListWidgetItem*
并发出一个不起作用的子类。所以我要做的就是转到editItem
然后将QListWidgetItem*
动态广播到QEventStore*