我在Xcode中创建C++项目,它链接到Qt框架.你好世界计划运作良好.当我添加从QObject派生的类并添加Q_OBJCET宏时,会出现链接错误.
这堂课是
MyObject.h
#ifndef MyObject_h
#define MyObject_h
#include <QtCore/QObject>
class MyOBject : public QObject
{
Q_OBJECT
public:
MyOBject();
};
#endif
Run Code Online (Sandbox Code Playgroud)
MyObject.cpp
#include "MyObject.h"
MyOBject::MyOBject()
{
}
Run Code Online (Sandbox Code Playgroud)
我知道我应该先使用moc编译MyObject.h,然后将生成的moc_MyObject.cpp添加到Xcode项目中.
在Microsoft Visual Studio中,我可以配置此头文件以使用moc自定义工具进行编译.并将生成cpp文件添加到VS项目.
但这是Xcode.我的问题是:在Xcode中是否有相同的平均值来编译包含Q_OBJECT宏的头文件?
我是 Qt 的新手。我正在尝试编译如下所示的小代码片段:
#include<QtCore/QtCore>
#include<QtCore/QObject>
class Test:public QObject
{
Q_OBJECT
public:
Test(){qDebug()<<"CTOR";}
};
int main()
{
Test t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下命令通过命令行运行它:
g++ -o signalTest.exe -l QtCore signalTest.cpp
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
undefined reference to vtable for Test
Run Code Online (Sandbox Code Playgroud)
我想我需要包含 的库QObject
,但我不确定。有任何想法吗?
假设我有一个名为animals.cpp
. 如何moc_animals.cpp
使用 CMake 生成 moc 文件 ( )?
我“不小心”将信号连接到QWidget::setToolTip()
:
bool ok = connect(source, &Source::textSignal, widget, &QWidget::setToolTip);
Q_ASSERT(ok);
Run Code Online (Sandbox Code Playgroud)
......它奏效了。不仅连接成功,函数也被正确调用。
自己试试:
main.cpp
#include <QApplication>
#include <QLineEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLineEdit le;
bool ok = QObject::connect(&le, &QLineEdit::textChanged, &le, &QWidget::setToolTip);
Q_ASSERT(ok);
le.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
setToolTip()
未声明为slot
.
来自 qwidget.h:
// [...]
public Q_SLOTS: // start of Q_SLOTS
void setWindowTitle(const QString &);
#ifndef QT_NO_STYLE_STYLESHEET
void setStyleSheet(const QString& styleSheet);
#endif
public: // from my understanding, this should end the Q_SLOTS region
#ifndef QT_NO_STYLE_STYLESHEET
QString …
Run Code Online (Sandbox Code Playgroud) 下面给出的代码是MOC在Qt中生成的代码.
const QMetaObject MainWindow :: staticMetaObject = {{&QMainWindow :: staticMetaObject,qt_meta_stringdata_MainWindow,qt_meta_data_MainWindow,0}};
为什么有两个连续的花括号,中间没有任何声明?此外,该声明是什么意思?只是逗号分隔变量意味着什么?
我有一个从.pro文件生成的项目.我无法编译它,因为没有生成MOC文件.
Q_OBJECT
用于要被MOCed的类的标头中#pragma once
用于要被MOCed的类的标头中我把冗长的详细信息,我可以看到在正确的类上调用了moc.然后,出现以下错误:standard input(0): Note: No relevant classes found. No output generated.
最后,编译器无法链接moc文件,并且构建失败:
8> moc_myClass.cpp
8>c1xx : fatal error C1083: Cannot open source file:
'D:\Things\\L_build\Stuff\moc\moc_myClass.cpp': No such file or directory
Run Code Online (Sandbox Code Playgroud)
任何线索?
我在Qt中设计用户界面,并且由于长寿原因,我不想要在未来的版本中使用Qt元对象编译器.我知道MOC在标准C++代码中解析某些宏,并根据这些代码生成C++代码.
我想知道的是:这个生成代码的文档在哪里?我想将生成的代码直接写入我的相关类.虽然现在这可能很麻烦,但如果Qt消失且MOC不再存在,它将通过避免任何问题在长期内使UI更加稳定.
谢谢!
编辑1: 我在Visual Studio(NOT Qt Creator)中设计了一个基于Qt的UI,用于不基于Qt框架的C++应用程序.我希望能够分发可以构建为纯C++的代码,其中Qt代码链接自将要打包的特定库.我希望能够在没有安装Qt的系统上构建此代码.因此,希望避免MOC.我不是想冒犯任何Qt粉丝,Qt很棒.但是,我在这个项目上需要一些不同的东西,所以"只使用MOC"的建议根本没有用.
编辑2:当我出错时,我已经足够承认了.经过一些思考和研究后,显然不值得尝试我正在计划的事情.我只需要保存MOC生成的代码并分发它.感谢大家.
我正在使用新语法QObject::connect
将信号连接到插槽:
connect(m_pNetworkReply, &QNetworkReply::error, this, &MyClass::onError);
Run Code Online (Sandbox Code Playgroud)
但我得到了这个奇怪的错误,我不明白为什么:
/home/user/Programming/sourcefile.cpp:131: error: no matching function for call to 'MyClass::connect(QNetworkReply*&, <unresolved overloaded function type>, MyClass* const, void (MyClass::*)(QNetworkReply::NetworkError))'
this, &MyClass::onError);
^
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我使用旧语法,一切正常:
connect(m_pNetworkReply, SIGNAL(QNetworkReply::error(QNetworkReply::NetworkError)),
this, SLOT(MyClass::onError(QNetworkReply::NetworkError)));
Run Code Online (Sandbox Code Playgroud)
此外,此连接工作正常:
connect(m_pNetworkReply, &QNetworkReply::finished,
this, &MyClass::replyFinished);
Run Code Online (Sandbox Code Playgroud)
也是void onError(QNetworkReply::NetworkError);
一个private slot
.
我究竟做错了什么?
编辑:
请注意,这不是应该起作用的代码.我写这个课只是为了隔离问题; 代码应该编译.
myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkReply>
class MyClass : public QWidget
{
Q_OBJECT
public:
explicit MyClass(QWidget *parent = 0);
~MyClass();
private slots:
void replyFinished(); …
Run Code Online (Sandbox Code Playgroud)