标签: moc

如何在Xcode中使用Q_OBJECT宏编译头文件?

我在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宏的头文件?

xcode qt moc qobject

2
推荐指数
1
解决办法
2119
查看次数

Linux 命令行编译 QObject 派生类

我是 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,但我不确定。有任何想法吗?

c++ qt moc qobject qtcore

2
推荐指数
1
解决办法
1610
查看次数

如何使用 CMake 生成 moc_*.cpp 文件

假设我有一个名为animals.cpp. 如何moc_animals.cpp使用 CMake 生成 moc 文件 ( )?

c++ qt moc

2
推荐指数
1
解决办法
4170
查看次数

为什么可以连接到未声明为 Q_SLOTS 的函数?

我“不小心”将信号连接到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)

c++ qt signals-slots qwidget moc

2
推荐指数
1
解决办法
329
查看次数

为什么有两个嵌套的花括号而中间没有任何语句?

下面给出的代码是MOC在Qt中生成的代码.

const QMetaObject MainWindow :: staticMetaObject = {{&QMainWindow :: staticMetaObject,qt_meta_stringdata_MainWindow,qt_meta_data_MainWindow,0}};

为什么有两个连续的花括号,中间没有任何声明?此外,该声明是什么意思?只是逗号分隔变量意味着什么?

c++ syntax qt moc

1
推荐指数
1
解决办法
332
查看次数

VS2013中生成MOC文件

我有一个从.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)

任何线索?

c++ qt compiler-errors moc visual-studio-2013

1
推荐指数
1
解决办法
2011
查看次数

Qt MOC生成了代码文档

我在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生成的代码并分发它.感谢大家.

c++ qt moc

0
推荐指数
1
解决办法
462
查看次数

新的QObject :: connect语法不起作用

我正在使用新语法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)

qt moc qobject qmetaobject

0
推荐指数
1
解决办法
499
查看次数