标签: moc

如何在qmake项目中向moc添加特定标志?

我使用qmake && make以下project.pro文件编译Qt可执行文件:

INCLUDEPATH *= ../../dependencies/boost
QT *= opengl xml
CONFIG *= qt opengl static

TARGET = myexe
HEADERS = Viewer.hpp MainWindow.hpp Inspector.hpp
SOURCES = main.cpp Viewer.cpp MainWindow.cpp Inspector.cpp
Run Code Online (Sandbox Code Playgroud)

但是,在编译时,moc会对无法解析的boost宏进行扼流.要解决这个bug,我需要将标志传递-DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED给moc,但我无法设法这样做.

如何编辑我的.pro文件以传递给定的标志moc?(但不是g++,QMAKE_CXXFLAGS如此)

qt qmake moc

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

QObject:缺少vtable链接错误

我知道这个问题已被问过很多次,但我在这里找不到解决方案,也没有在谷歌找到解决方案.

这是我的头文件

#ifndef MAINCONTROLLER_H
#define MAINCONTROLLER_H

#include <QSettings>
#include <QDebug>
#include <QDir>
#include <QObject>

#include "PhTools/PhString.h"
#include "PhStrip/PhStripDoc.h"

class MainController : public QObject
{
    Q_OBJECT

public:
    explicit MainController(QObject *parent = 0);
    void loadSettings();
    PhString getLastFile();
    void setLastFile(PhString fileName);
    bool openDoc(PhString fileName);

signals:
    void docChanged();

private:
    QSettings * _settings;
    PhStripDoc * _doc;

};

#endif // MAINCONTROLLER_H
Run Code Online (Sandbox Code Playgroud)

我的CPP档案:

#include "MainController.h"


MainController::MainController(QObject *parent) :
    QObject(parent)
{
    _doc = new PhStripDoc();
    loadSettings();
}
void MainController::loadSettings()
{
    _settings = new QSettings(QDir::homePath() + "/Library/Preferences/com.me.me.plist", QSettings::NativeFormat);

    getLastFile(); …
Run Code Online (Sandbox Code Playgroud)

c++ qt moc qt-signals qtcore

8
推荐指数
2
解决办法
2270
查看次数

C++使用信号槽进行QML

我有一个小班不能正常工作,我不知道它有什么问题.编译器给出了以下消息:

main.cpp: error: undefined reference to 'CDetails::CDetails()'
Run Code Online (Sandbox Code Playgroud)

这是代码中的快照:

//main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include <QDebug>

class CDetails : public QObject
{   Q_OBJECT
    public:
        CDetails() {}
        ~CDetails(void) {}


    public slots:
        void cppSlot(const QString &msg)
        {    qDebug() << "Called the C++ slot with message:" << msg;
        }
};

int main(int argc, char *argv[])
{   QGuiApplication app(argc, argv);
    QtQuick2ApplicationViewer viewer;
    viewer.setMainQmlFile(QStringLiteral("qml/testqml/main.qml"));
    viewer.showExpanded();

    CDetails *test = new CDetails();
    QObject::connect((QObject*)viewer.rootObject(),
                 SIGNAL(qmlSignal(QString)),test,
                 SLOT(cppSlot(QString)));
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

在main.qml中:

import QtQuick 2.0
Rectangle {
    id: guide …
Run Code Online (Sandbox Code Playgroud)

c++ qt moc qml qt-quick

8
推荐指数
2
解决办法
1202
查看次数

Qt MOC与MSBuild并行的多个文件

早上好!

我知道这里已经有了这个问题:Qt在msbuild下并行多个文件,但我不会出现这个老问题.

我在Visual Studio 2010下工作,我必须加快我的应用程序的编译时间.我使用所有标志,如/MPMSBuild -j和Make等...优化的最后一步是并行化MOC的步骤.他们的速度非常缓慢,我搜索了很多,但我没有找到解决方案.

我知道它jom存在,但它使用nmake,我必须使用MSBuild.

如果有人已经听过解决方案,那应该真的很酷!

祝你今天愉快!

msbuild qt visual-studio-2010 moc

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

多个定义错误:一个在我的文件中,一个在moc文件中.

我有一个名为FindAndReplaceBar的类,其实现如下:

#include "FindAndReplaceBar.h"
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QTextDocument>
#include <QLineEdit>

FindAndReplaceBar::FindAndReplaceBar(QObject *parent) :
    QToolBar(NULL)
{
    lblFind         = new QLabel("Find: ",this);
    lblReplace      = new QLabel("Replace",this);

    ledtFind        = new QLineEdit(this);
    ledtReplace     = new QLineEdit(this);

    QPixmap next(":/res/resources/next.gif");
    QPixmap previous(":/res/resources/previous.gif");
    QPixmap close(":/res/resources/close_icon.gif");

    btnFindNext     = new QPushButton(QIcon(next),"",this);
    btnFindPrevious = new QPushButton(QIcon(previous),"",this);
    btnClose        = new QPushButton(QIcon(close),"",this);

    btnReplace      = new QPushButton("Replace",this);
    btnReplaceAll   = new QPushButton("Replace All",this);

    btnFindNext->setFlat(true);
    btnFindPrevious->setFlat(true);
    btnClose->setFlat(true);
    btnReplace->setFlat(true);
    btnReplaceAll->setFlat(true);

    lytFindAndReplaceBar        = new QGridLayout(this);

    lytFindAndReplaceBar->addWidget(lblFind,0,0,1,1);
    lytFindAndReplaceBar->addWidget(ledtFind,0,1,1,2);
    lytFindAndReplaceBar->addWidget(btnFindPrevious,0,3,1,1);
    lytFindAndReplaceBar->addWidget(btnFindNext,0,4,1,1);

    lytFindAndReplaceBar->addWidget(lblReplace,0,5,1,1);
    lytFindAndReplaceBar->addWidget(ledtReplace,0,6,1,2);
    lytFindAndReplaceBar->addWidget(btnReplace,0,8,1,1);
    lytFindAndReplaceBar->addWidget(btnReplaceAll,0,9,1,1);

    this->setLayout(lytFindAndReplaceBar); …
Run Code Online (Sandbox Code Playgroud)

qt4 multiple-definition-error moc

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

卡恩过程网络与演员模型的区别

我想知道Kahn Process Network和Actor Model之间的实际区别是什么.实际上,如果我查看定义,它们都是模型,其中计算实体(在两种情况下称为Actors ......)通过无界缓冲区交换消息.此外,在这两种情况下,这些消息都是异步发送的,因为过程总是可以发送消息.它不需要等待收件人准备好接收.

因此,我的问题是,有任何实际的区别吗?

非常感谢 !

model moc actor

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

qt moc 错误:usr/include/c++/10/bits/fs_fwd.:39:“std”处解析错误

我的配置是:

ubuntu 21.04
gcc 11
qt 5.15.2
Run Code Online (Sandbox Code Playgroud)

和这样的错误消息:

AutoMoc subprocess error
------------------------
The moc process failed to compile
  "SRC:/src/Layers/ViewLayer/Process/NearFieldProcessUtil.h"
into
  "SRC:/build/MTESS_autogen/MLM4FWGUYC/moc_NearFieldProcessUtil.cpp"

Command
-------
/usr/lib/qt5/bin/moc -DJSON_DIAGNOSTICS=0 -DJSON_USE_IMPLICIT_CONVERSIONS=1 "-DvtkRenderingCore_AUTOINIT_INCLUDE=\"/home/alex/workspace/mtess/MTESS/build/CMakeFiles/vtkModuleAutoInit_be7301261a49b13d6a9b1d9e110eacd8.h\"" -I/home/alex/workspace/mtess/MTESS/src -I/home/alex/workspace/mtess/MTESS/vendor/ProjectStructure -I/home/alex/workspace/mtess/MTESS/vendor/imgui -I/home/alex/workspace/mtess/MTESS/vendor/imgui/imgui -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/local/qwt-6.2.0/include -I/usr/local/include/opencascade -I/lib -I/usr/local/include -I/usr/include/vtk-9.0 -I/usr/include/c++/10 -I/usr/include -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -I/usr/include/c++/11/backward -I/usr/lib/llvm-14/lib/clang/14.0.0/include -I/usr/include/x86_64-linux-gnu --include /home/alex/workspace/mtess/MTESS/build/MTESS_autogen/moc_predefs.h --output-dep-file -o /home/alex/workspace/mtess/MTESS/build/MTESS_autogen/MLM4FWGUYC/moc_NearFieldProcessUtil.cpp /home/alex/workspace/mtess/MTESS/src/Layers/ViewLayer/Process/NearFieldProcessUtil.h

Output
------
usr/include/c++/10/bits/fs_fwd.:39: Parse error at "std"
Run Code Online (Sandbox Code Playgroud)

相同的代码库在 Windows 中使用qmake成功编译,我正在将编译方法转换为cmake,这不应该是代码问题,而是 cmake 配置或工具链兼容性问题。我的问题是:

  1. 如何让cmake使用特定编译器的唯一包含的?

    正如你所看到的,似乎 3 个包含的 gcc-10、gcc-11、clang-14 都被使用了。我尝试卸载 gcc-10,但 clang-14 依赖于它,并且我使用了 update- alternatives指定 gcc、g++、clang 和 …

qt moc

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

为什么这个简单的Qt应用程序没有链接

我试着像这样编写一个简单的Qt应用程序:

main.cpp:

#include <QApplication>

class MyApp : public QApplication {
        Q_OBJECT
public:
        MyApp(int argc, char* argv[]);
};

MyApp::MyApp(int argc, char* argv[]) :
        QApplication(argc,argv) {
}

int main(int argc, char* argv[]) {
    MyApp app(argc,argv);
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译并将其与Qt Creator 2.3.1(Qt 4.7.4)链接时,我得到3个"未解析的外部符号"错误:

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual struct QMetaObject const*__thiscall MyApp :: metaObject(void)const"
    (?metaObject @ MyApp @@ UBEPBUQMetaObject @@ XZ)".

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual void*__thiscall MyApp :: qt_metacast(char const*)"
    (?qt_metacast @ MyApp @@ UAEPAXPBD @ Z)".

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual int __thiscall MyApp :: qt_metacall(enum QMetaObject :: Call,int,void**)" …

c++ qt qt4 qt-creator moc

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

发射和发射之间的区别()

在Qt中,它们都是有效的,并且行为相同:

emit someSignal(value);
Run Code Online (Sandbox Code Playgroud)

VS

emit(someSignal(value));
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?

c++ qt moc qt-signals qtcore

6
推荐指数
2
解决办法
2634
查看次数

CMake AUTOMOC 很慢

我有一个使用 CMake 构建的 QT 项目。其中一个目标有 142 个文件需要moc. 当我使用qt5_wrap_cpp源文件并构建它时,该过程在大约 15 秒内完成: qt5_wrap_cpp

set(CMAKE_AUTOMOC NO)
qt5_wrap_cpp(moc_files ${source_files})
list(APPEND source_files ${moc_files})
target_sources("${target}" PRIVATE "${source_files}")
Run Code Online (Sandbox Code Playgroud)

这里的每个任务都是为每个文件调用moc工具。

然而,当我使用AUTOMOC特征时,生成时间增加到 6 分钟: 自动 是

set(CMAKE_AUTOMOC YES)
target_sources("${target}" PRIVATE "${source_files}")
Run Code Online (Sandbox Code Playgroud)

这里的cmake任务大致如下:

cmake.exe -E cmake_autogen <my_project_path>/<my_project>_autogen.dir Debug
Run Code Online (Sandbox Code Playgroud)

我再次运行该命令,在没有任何内容可生成的情况下,运行需要 0.3 秒。然而,当我删除一个 moc 文件时,该命令需要 2 秒才能运行。当需要生成5时是:

TotalSeconds : 11.3493687

超过11秒。当我删除所有 142 个 moc 文件时,执行时间为cmake_autogen

TotalSeconds : 354.5894649

我没有在文档和 CMake 问题中找到任何与此相关的内容。我可以做些什么来AUTOMOC像单个文件处理一样高效地运行吗?

CMake版本3.10.2
Qt版本5.9.3


更新1。

在分析 CMake 之后,我注意到调用moc是最耗时的操作。命令行似乎有 247 个包含路径,而 …

qt cmake moc automoc

6
推荐指数
0
解决办法
1322
查看次数