Qt 对象信号未连接到方法(处理程序)
Posted
技术标签:
【中文标题】Qt 对象信号未连接到方法(处理程序)【英文标题】:Qt object signals are not connected to methods(handlers) 【发布时间】:2012-04-10 11:41:13 【问题描述】:我在处理 Qt 中的点击时遇到了问题。我有以下课程:
class MyRectItem : public QObject, public QGraphicsEllipseItem
Q_OBJECT
public:
MyRectItem(double x,double y, double w, double h)
: QGraphicsEllipseItem(x,y,w,h)
public slots:
void test()
QMessageBox::information(0, "This", "Is working");
printf("asd");
signals:
void selectionChanged(bool newState);
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value)
if (change == QGraphicsItem::ItemSelectedChange)
bool newState = value.toBool();
emit selectionChanged(newState);
return QGraphicsItem::itemChange(change, value);
;
现在我想将一个插槽连接到信号,我执行以下操作:
MyRectItem *i = new MyRectItem(-d, -d, d, d);
i->setPen(QPen(Qt::darkBlue));
i->setPos(150,150);
// canvas is a QGraphicsScene
canvas.addItem(i);
i->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
QObject::connect(&canvas, SIGNAL(selectionChanged(bool)), this, SLOT(test()));
当我运行它时,圆圈显示在canvas
上,但是当我点击圆圈时没有任何反应,控制台显示以下内容:
Object::connect: No such signal QGraphicsScene::selectionChanged(bool)
有什么建议吗?
【问题讨论】:
【参考方案1】:您是否已经尝试过:
QObject::connect(&canvas, SIGNAL(selectionChanged()), this, SLOT(test()));
据我所知,来自 QGraphicsScene 的信号 selectionChanged 没有任何参数:http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#selectionChanged。
在这里,您尝试将来自 QGRaphicsScene 的信号连接到插槽“test”,而不是您在 MyRectItem 中定义的信号。如果你想连接来自 MyRectItem 的信号,你应该这样做:
QObject::connect(i, SIGNAL(selectionChanged(bool)), this, SLOT(test()));
第一个参数是信号的来源(发送者)。
杰拉德
【讨论】:
【参考方案2】:控制台消息就是您的答案。由于您没有指定您使用的 Qt 版本,我将假设 4.8 作为最新的稳定版本。从here可以看出,确实没有这样的信号
selectionChanged(bool)
但是,有一个信号
selectionChanged()
【讨论】:
以上是关于Qt 对象信号未连接到方法(处理程序)的主要内容,如果未能解决你的问题,请参考以下文章