【问题标题】:QToolButton signal and slotQToolButton 信号和槽
【发布时间】:2017-12-02 12:53:09
【问题描述】:

我有一个 display.cpp 类,它有一个 QToolButton "start" 应该开始游戏。 我还有一个 singleton controller.cpp 类,它创建一个 display.cpp 对象并获取 QToolButton“start”的指针。所以现在我尝试将“开始”按钮的 clicked(bool) SIGNAL 连接到我在 controller.h 中的自定义 SLOT,但由于某种原因它不起作用。

它确实编译并运行。

两个类都继承 QObject 和 Q_Object 宏。

//controller.h
public slots:
    void initGame(bool);

//controller.cpp
void Controller::initConnectors(){

    /*create object of Display.cpp*/
    Display *sender = new Display();

    /*getStartButton from display.cpp and connect it*/
    connect(sender->getStartButton(),SIGNAL(clicked(bool)), getControllersInstance() ,SLOT(initGame(bool)));
}

void Controller::initGame(bool a)
{
  std::cout << "Received Signal?" <<std::endl;
}

display.cpp:

/*Button that is used to start the game*/
QToolButton *Display::getStartButton() const
{
return startButton;
}

在main.cpp中:

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow m;
Controller::Create();
Controller * controller = Controller::getControllerInstance();
controller->initConnectors();
m.show();
return app.exec();
}

按下“开始”按钮后,什么也没有发生!我测试了 display.cpp 类本身的“开始”按钮,它工作正常。但是在我将按钮传递给controller.cpp 之后,它就不再起作用了!

【问题讨论】:

  • 显示显示类。
  • 使用现代 C++ 和最新版本的 Qt;我建议远离基于字符串的信号/槽函数以及相关的SIGNAL()SLOT() 宏。而是使用编译时检查的指向成员函数的指针语法。它有几个优点:在编译时而不是在运行时标记错误,因此更难出错,而且效率更高。还;在许多情况下,您不需要加速编译的 Q_OBJECT 宏。
  • 如果您希望我们帮助您,您必须提供minimal reproducible example,您当前的代码需要添加元素才能使其正常工作。

标签: c++ qt


【解决方案1】:

您将插槽声明为int initGame(bool);,但稍后定义void initGame(bool)

我想这是问题的根源。确保使用相同的类型。 如果这不能解决问题,我们将需要查看完整的代码。

【讨论】:

  • 对不起!这是我的一个错字!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2012-07-13
相关资源
最近更新 更多