⑴ 一段简单的Qt代码纠错~~谢谢
在QT中对于类的声明,要放在头文件里,不然对于有Q_OBJECT宏声明的类,QT是没有办法生成MOC预编译文件的。请新建一个头文件,把类的声明部分加到头文件里,就可以解决了
⑵ 求助,Qt编译出现“无法解析的外部符号”错误
用的Qt creator。新建一个Dialog,仅仅在dialog.h里添加了private slots: void buttonClicked();编译就出错D:\MyProjects\Qt\dialog\slot\solt-build-Desktop_Qt_5_0_0_MSVC2010_32bit_SDK-Debug\debug\moc_dialog.obj:-1: 错误:LNK2019: 无法解析的外部符号 "private: void __thiscall Dialog::enableFindButton(class QString const &)" ([email protected]@@[email protected]@@Z),该符号在函数 "private: static void __cdecl Dialog::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@[email protected]@@[email protected]) 中被引用未找到文件 moc_dialog.obj。
⑶ VC Qt 不生成moc资料是什么原因
QT中的moc? moc是QT的预编译器,用来处理代码中的slot,signal,emit,Q_OBJECT等。 moc文件是对应的处理代码,也就是Q_OBJECT宏的实现部分,在官方文档上有详细说明,与其文件在同一目录下。
⑷ 急求Q_OBJECT问题
Qt官方文档中是这么说的:Q_OBJECT宏由预处理器展开,该宏声明了几个由moc实现的成员函数。如果编译时,你发现“undefined reference to vtable for XX”错误消息,那么你就有可能是忘了运行moc程序,或者是在链接程序中,没有包含moc的输出文件。这种错误情况我碰到过,不过发现是编译器的问题,我把编译生成的文件删除就解决了
⑸ moc文件是什么在哪可以找到有什么作用….
QT中的moc?moc是QT的预编译器,用来处理代码中的slot,signal,emit,Q_OBJECT等。moc文件是对应的处理代码,也就是Q_OBJECT宏的实现部分,在官方文档上有详细说明,与其文件在同一目录下。
⑹ qt信号和槽机制的问题
你可以把信号和槽的关系理解为函数调用的问题。当你的程序中某处发出了一个信号,例如emit valueChanged(100),那么相当于你要调用和这个信号相连的槽,即上一句可以理解为调用setNum(100)。 当然,信号和槽比上述调用要先进,例如可以在含有emit valueChanged(100)的函数执行完成后才调用setNum(100)函数。也可以在执行emit valueChanged(100)的地方调用setNum(100),setNum(100)执行完成后再继续执行下一句。就像“ianynchen”所说的那样相当于函数指针。 既然相当于函数调用,那么信号和槽的参数类型和顺序应该一致。当然如果信号的参数个数多于与其关联的槽的参数个数,多于的这些参数不可能传入槽中,因此被忽略了。 用信号和槽机制可以方便模块化程序设计,也就是说编写模块的时候不用理会发出的信号会被谁接收,接收后会干什么,同理不用理会信号由谁发出,如何发出。你可以试试看如果不用信号和槽机制,让一个模块调用另一个模块的函数,你会发现这时你需要对着两个模块的结构都有了解才能进行下去。 同时信号和槽可以动态链接和unconnect,非常灵活。 信号和槽是QT中的一个非常重要的内容,建议你多花时间学习,灵活运用信号和槽可以大大简化你的程序设计工作。建议你好好看看帮助文档中关于信号和槽的那部分内容。 信号和槽的实现过程实际上是QT将你的源代码翻译了一下,变成了含有_moc的标准CPP源文件,然后才去编译连接。有时间的话你可以对比一下你的源代码和翻译后的含有_moc的源代码.
⑺ 100分求助~QT程序设计,加入宏Q_OBJECT后编译不成功
直接qmake工程文件, 然后用Makefile就可以了, g++ moc ld都是全自动的. 定义过的函数在cpp里面要实现, 即使是空的也要写出来. 信号一定不要去写实现, 交给moc做
⑻ qt 怎么根据ui文件动态创建QWIdget窗口部件
动态对话框是在程序运行时用 Qt Designer 的.ui 文件创建。不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序时使用类 QUiLoader 加载.ui文件,例如下面的代码: QUiLoader uiLoader; QFile file("sortdialog.ui"); QWidget *sortDialog = uiLoader.load(&file); if (sortDialog) { … } 子控件可以用 QObject::findChild<T>()得到 QComboBox *primaryColumnCombo = sortDialog->findChild<QComboBox *>("primaryColumnCombo"); if (primaryColumnCombo) { … } findChild<T>()是模板成员函数,得到类型为 T 的给定名字的子控件的指针。由于编译器的原因,用 MSVC6 是得不到的。如果使用的是 MSVC6,那么可以使用全局函数qFindChild<T>()。 QUiLoader 类在一个单独的链接库中,如果在一个应用程序中使用了 QUiLoader,必须在这个程序的.pro文件中添加下面这样的代码: CONFIG += uitools 使用动态对话框不用重新编译程序就能够改变对话框的布局。
⑼ 关于Qt函数返回的问题(涉及隐式共享)
第一:这不是终端用户关心的问题,Qt是使用的标准C++,虽然在语法上有些小奇怪,但是是标准C++允许的,Qt不属于C++的部分是预处理器moc,所以我们看到slot和signal关键字在源文件里定义的知识一个空宏。第二:隐式共享这个问题确实是Qt为了优化C++的资源分配管理而使用的一个常用技巧,这个技巧的思想来源于智能指针和私有保护,简单点说就是判断操作是否会对某个共享域进行不可逆的影响,这个是通过类的方法实现的,某些方法会强制共享域深度拷贝,这点是使用Qt的私有保护代码实现的,就是qobject里令人感觉无比恶心的那几个宏(生成私有类成员等)。第三:Qimage内部使用了qpixmap,这块资源是共享的,如果我没记错的话,其实对使用没有任何影响,只有做Qt库本身扩展或者优化的时候才回去看代码。