信号和槽Qt

Posted

技术标签:

【中文标题】信号和槽Qt【英文标题】:Signal and slot Qt 【发布时间】:2013-12-07 04:15:08 【问题描述】:

我正在尝试编写一个非常简单的日历程序(我正在尝试学习 Qt)。该程序本身非常基本,它所做的只是打开一个对话框,显示今天的日期,旁边有一个按钮。当按下按钮时,另一个对话框打开,我将其称为日历选择器。

这是程序的要点:首先,主对话框打开,显示当前日期。然后,当按下图片中显示的按钮时,会向一个函数发送一个信号,该函数打开选择器并在两个类之间建立连接,我将在下面描述!选择器将打开,您可以在其中选择一个日期(如果需要)。假设您通过双击选择一个日期。然后将信号发送到关闭选择器的函数,然后该函数向主对话框发出信号以将日期更新为新日期。现在问题来了:

主对话框和选择器都在不同的类中,我试图在双击项目时在两个类之间建立连接。

***编辑:好的,现在我的问题是我在头文件中声明了 Picker *mypicker,当我尝试在 .cpp 文件中使用它时,例如 mypicker->show();它会导致程序崩溃。有人知道为什么吗?

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

undefined reference to MainDialog::updateDate(QDate)

通常意味着编译器或链接器找不到对它的引用。所以在你的标题中,你承诺它会存在。

然后,如果稍后匹配时,参考文献从未找到......你会得到一个错误。

所以可能发生的只是以下几件事之一:

在您的 maindialog.cpp 文件中,您有:

// Either no definition of updateDate at all,  Wrong because you put in your header a declaration for one.

void updateDate(QDate date) // Wrong because it doesn't specify MainDialog





void MainDialog::updateDate() // Wrong because it doesn't match the parameter list




void MainDialog::updatedate(QDate date) // Wrong because the function name is off




QDate MainDialog::updateDate(QDate date) // Wrong because return type is off




void MainDialog::updateDate(QDate date) // Correct!  Matches the header file perfectly!



然后,在您解决了其他编译​​错误之后,请密切注意应用程序输出,因为连接调用是运行时连接,所以它不会报告语法错位,直到连接完成尝试过。

希望对您有所帮助。

【讨论】:

非常感谢所有案例。它帮助我弄清楚了我的问题。你还认为你能帮我做一件小事吗?我在头文件中声明了一个指针。没有什么特别的,只是声明为 Picker *picker。但是,当我尝试执行诸如 picker->show(); 之类的操作时或者尝试像我在程序崩溃上面所做的那样连接 .cpp 文件。你认为你会知道为什么会这样吗? 指针只是一个内存地址。堆上没有分配对象的内存地址毫无价值。它们为空,访问它们会导致错误。您需要在任何代码行访问它之前调用picker = new Picker; 另外,最好在构造函数的顶部将所有类似的指针设置为零,然后在访问它们之前,您可以使用if(picker) 检查它们是否非零。在您调用new 并将内存分配给该位置后,它不再为零,if(picker) 将返回true

以上是关于信号和槽Qt的主要内容,如果未能解决你的问题,请参考以下文章

Qt信号和槽的问题

Qt 6.x中的信号和槽介绍及示例

Qt 6.x中的信号和槽介绍及示例

qt信号和槽机制的问题

QT学习之信号和槽

Qt信号和槽