【问题标题】:Qt in visual studio: connecting slots and signals doesn't workVisual Studio中的Qt:连接插槽和信号不起作用
【发布时间】:2010-02-26 11:55:28
【问题描述】:

我已经安装了 Qt 和 Qt for VS 插件。一切正常,UI 应用程序可以编译和运行,但连接信号和插槽却不行。我的班级中有Q_OBJECT,为了连接,我在构造函数中使用了这段代码:

connect(ui.mainTableView, SIGNAL(activated(const QModelIndex &)),
        this, SLOT(showDetail(const QModelIndex &)));

编辑:

showDetail方法:

void MyClass::showDetail(const QModelIndex &index)
{
    this->setWindowTitle("it works");
}

窗口标题没有改变,也没有到达断点。

在Generated Files目录下生成了moc文件,但是那个类的moc文件是空的(其他没有),我想是因为这个类没有信号,只有一个槽。

即使 Designer 生成的连接也不起作用,并且调用 connect 方法返回 true

【问题讨论】:

  • 错误列表应该会有所帮助。发布它。
  • 您应该将结果作为答案发布,而不是作为问题的一部分。
  • 您应该始终检查连接的返回值,通常使用断言。这样,如果它失败了,你会立即知道。

标签: c++ qt qt4 signals-slots


【解决方案1】:

SIGNALSLOT 宏中删除变量名:

connect(ui.mainTableView, SIGNAL(activated(const QModelIndex &)),
    this, SLOT(showDetail(const QModelIndex &)));

有关更多详细信息,请仔细阅读QObject::connect 上的文档。

【讨论】:

  • 您是否将您的MyClass::showDetail 标记为MyClass 类定义中的插槽?
  • 是的,使用public slots: void showDetail(const QModelIndex &index);
【解决方案2】:

您的moc 工作正常吗?这可以解释为什么 connect 没有做它的事情,但其他一切都是......

【讨论】:

  • moc文件是在Generated Files目录下生成的,但是那个类的moc文件是空的(其他没有),我认为是因为这个类没有信号,只有一个槽。跨度>
  • moc_MyClass.cpp 不应该是空的,即使你的类是空的,你有没有从QObject继承MyClass
  • 是的,它继承自 QMainWindow。 (真的很奇怪。)
  • 如果没有moc 生成的代码,信号和插槽将无法工作。尝试找出moc 生成空文件的原因。 moc 在处理您的MyClass.h 时是否显示任何警告?
  • 您是否尝试将所有代码复制到一个新项目中?记得以前用Qt的时候,QMake之类的问题很多,有时候好像是跳过了一些东西。
【解决方案3】:

在 Visual Studio 2012 中,尝试使用时

connect(plot->xAxis, SIGNAL(rangeChanged(QCPRange)), plot->xAxis2, SLOT(setRange(QCPRange)));

plotSIGNAL 出现错误。

这是因为 Visual Studio 发现了错误的连接。它在winsock.h 中找到了connect

为了修复错误,我使用了QObject 命名空间,如下所示:

QObject::connect(plot->xAxis, SIGNAL(rangeChanged(QCPRange)), plot->xAxis2, SLOT(setRange(QCPRange)));

作为参考,这里是错误信息。

对于第一个 plot 参数,错误是:

ERROR: argument of type "QCPAxis*" is incompatible with parameter of type "Socket".

对于第一个SIGNAL,错误是:

ERROR: argument of type "cosnt Char*" is incompatible with parameter of type "const sockaddr*".

对于第二个plot 参数,错误是:

ERROR: argument of type "QCPAxis*" is incompatible with parameter of type "int".

对于第二个SIGNAL,错误是:

ERROR: too many arguments in function call.

【讨论】:

    【解决方案4】:

    结果:

    哦,不,这是一个愚蠢的问题,谢谢大家,所有的答案都促使我找到了解决方案,但最后一步是发现在我的平台上,项目只能通过双击激活,而不是单击激活。对不起

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多