信号和槽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的主要内容,如果未能解决你的问题,请参考以下文章