无法添加插槽并将其连接到按钮

Posted

技术标签:

【中文标题】无法添加插槽并将其连接到按钮【英文标题】:Unable to add slot and connect it to a button 【发布时间】:2015-05-18 08:41:02 【问题描述】:

我从 Qt 框架的示例库中收集了一个名为 calendar 的应用程序代码。我正在尝试从中学习并添加一些功能。我现在遇到的问题是我想为我创建的两个按钮实现两个功能(一个用于增加天数,第二个用于减少)。

我在增加天数的函数中添加的代码是:

void MainWindow::forward(int *click_forward)

    click_forward++;

以及添加到减少天数的函数中的代码:

void MainWindow::backwards(int *click_backwards)

    click_backwards--; 

在构造函数中,我定义了一个名为 click which int 类型,然后我通过引用将此变量发送给两个函数:

   forward(&click);
   backward(&click);   

在头文件中,在公共 slosts 区域这两个函数是 定义为:

   void forward(int *click_forward);

   void backwards(int *click_backwards);

我还实现了两个 SIGNAL-SLOT 连接:

   QObject::connect(nextbtn, SIGNAL(clicked()), this, SLOT(forward(int  
   &click)));

   QObject::connect(beforebtn, SIGNAL(clicked()), this, 
   SLOT(backwards(int &clickt))); 

但由于某些原因,当我编译项目时,我收到一条信息:

   QObject::connect: No such slot MainWindow::forward(int &click) 

   QObject::connect: No such slot MainWindow::backwards(int &clickt)

我想在这两个函数中使用指针,只是为了处理原始变量本身而不是副本。 能否请您指出我做错了什么。

谢谢,

【问题讨论】:

你好,信号和槽需要有相同的签名。此外,我相信您的意思是 (*click_forward)++;如果您想以这种方式使用插槽,请创建一个维护点击计数器的中间对象。 【参考方案1】:

问题是你的信号和槽有不同的签名:信号没有参数,但槽有一个指针类型的参数。此外,即使您的信号连接可以工作,当您修改临时定义的变量click_backwards 等时,执行此类代码(至少)也不会做任何有用的事情。

我会通过以下方式解决这个问题:

定义类成员变量和槽:

class MainWindow

    [..]
private slots:
    void forward();
    void backwards();

private:
    int click_forward;
    int click_backwards;

定义槽:

void MainWindow::forward()

    click_forward++;


void MainWindow::backwards()

    click_backwards--; 

最后建立连接:

QObject::connect(nextbtn, SIGNAL(clicked()), this, SLOT(forward()));
QObject::connect(beforebtn, SIGNAL(clicked()), this, SLOT(backwards())); 

【讨论】:

非常感谢您的回答,但还有另一个问题,由于当我尝试使用您的解决方案并编译程序时,我收到:没有匹配函数调用 MainWindow::forward( int*),因为我在构造函数中以这种方式回忆了函数 - forward(&click);所以在函数本身中应该有可能收到这个变量“点击”。你能帮我解决这个问题吗? forward()backwards() 函数都没有任何参数。你也需要在没有参数的情况下调用它们。 但是当他们接收到通过构造函数中的引用传递给这些函数的变量的地址时,他们两个都不应该有任何参数: int click;前进(&点击);向后(&点击)? 我问是因为现在我从这些函数中删除了参数,现在它们是:void MainWindow::forward()(*click_forward)++; void MainWindow::backwards () (*click_backwards)--; 在标题中这些函数的定义现在是: void forward();无效向后(); 并且在编译时我收到一个错误,例如:没有匹配函数调用'MainWindow::forward(int*)'【参考方案2】:

如果您像这样执行信号和插槽,那么您会收到编译器错误而不是运行时错误,我个人认为这非常有用,因为它只会告诉您由于信号/插槽不兼容而无法连接

p>
QObject::connect(nextbtn, &QPushButton::clicked, this, &MainWindow::forward);

【讨论】:

【参考方案3】:

顺便说一句,你不是在增加整数的值,而是在增加指针。

这是一个等待发生的错误。

【讨论】:

澄清一下,这样做:(*click_forward)++ 而不是:click_forward++。与click_backwards-- 相同。 希望他已经分配了整数,而不仅仅是在随机内存中闲逛......

以上是关于无法添加插槽并将其连接到按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何将查询参数添加到 BigQuery 并将其连接到 Data Studio?

Qt Connect 无法连接到插槽

在 UILabel 中处理触摸事件并将其连接到 IBAction

多个下载按钮

使用 recompose setStatic 并将其连接到 redux (nextjs)

创建记录并将其连接到现有记录棱镜客户端(1 对 1 关系)