标签: moc

如何自动化Qt moc?

我必须从Qt命令提示符运行以下命令:qmake -project然后make这给了我带有Moc文件的调试文件夹.
奇怪的是,这是我的电脑生成moc_.cpp文件的唯一方式.

那么如何自动执行这些命令的任务,以便我不必再次使用这些命令?

c++ qt qmake moc

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

在VS2010项目中使用Q_OBJECT给出了未解析的外部

我正在尝试在Visual Studio 2010 Ultimate项目中使用Q_OBJECT宏,它给了我未解决的外部错误:

1>Application.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyButton::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyButton@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyButton::qt_metacast(char const *)" (?qt_metacast@MyButton@@UAEPAXPBD@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyButton::metaObject(void)const " (?metaObject@MyButton@@UBEPBUQMetaObject@@XZ)
Run Code Online (Sandbox Code Playgroud)

我有一个使用QMaker的类似项目,并通过干净的项目和重新运行qmake来解决它.问题是,VS中没有"Qmake"按钮!

我读过很多像这样的文章并完成了他们告诉我的所有内容.虽然它没有真正帮助,因为我已经有一些.cpp和一些头文件的现有项目,我想避免创建.pro文件并将代码移入其中.

我已经安装了VS Qt插件,它在VS面板上给了我新的酷"Qt"按钮,虽然没有帮助解决未解决的外部(可能我不知道如何正确使用它).

我在我的Application.h文件(唯一一个有Q_OBJECT)的VS中运行了通过自定义构建工具的moc,但是仍然没有帮助:

C:\Utilities\QtSDK\Desktop\Qt\4.8.1\msvc2010\bin\moc Application.h -o tmp\moc\moc_Application.cpp
Run Code Online (Sandbox Code Playgroud)

什么可能导致我的问题,我该如何解决?

qt qmake visual-studio-2010 unresolved-external moc

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

如果 .cpp 文件中有 Q_OBJECT 宏,为什么我的项目无法链接?

此代码按预期编译、链接和工作:

#include <QApplication>
#include <QListView>
#include "File_List_Model.h"

int main(int c,char**v)
{
    QApplication app(c,v);
    QStringList list;

    list << "a" << "b" << "c";

    File_List_Model* model = new File_List_Model;
    model->set_entries(list);

    QListView* view = new QListView;
    view->setModel(model);
    view->show();

    return app.exec();
} 
Run Code Online (Sandbox Code Playgroud)

但是当我将类定义放在.cpp文件而不是头文件中时,我收到链接器错误,指出vtable未正确定义。

#include <QApplication>
#include <QListView>
//#include "File_List_Model.h"
#include "File_List_Proxy.h"
#include <QAbstractItemModel>
#include <QStringList>

class File_List_Model : public QAbstractItemModel
{
    Q_OBJECT
private:
    QStringList data_;
public:
    File_List_Model(QObject *parent = 0) :
        QAbstractItemModel(parent)
    {
    }

    int columnCount(const QModelIndex& parent) const
    { …
Run Code Online (Sandbox Code Playgroud)

qt qmake moc

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

如何将managedObjectContext从appDelegate传递到第一个ViewController,当它们是两个视图之间的导航控制器时

在研究和试图弄清楚如何解决以下问题时,我已经在键盘上打了3天以上.

我有一个看起来像这样的故事板:

初始应用程序启动箭头 - >到导航控制器 - >到主视图控制器.

我的appDelegate正在创建managedObjectContext,它用数据填充一些实体(仅用于测试目的,一旦我准备好与外部源集成,它将被删除).这工作很好.现在我的问题是我不知道我如何将MOC从appDelegate传递到我的第一个ViewController,因为导航控制器挡住了.我在appDidFinish方法中的当前代码如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Pass the managed object context to the root view controller
    MainMenuViewController *rootView = (MainMenuViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext; 

    //My actual Core data setup and adding data to it, it works I've tested it.

    return YES;
     }
Run Code Online (Sandbox Code Playgroud)

现在,当我将故事板中的应用程序启动箭头指向我的mainMenuViewController时,我的代码可以正常工作,但是我的所有视图中都丢失了导航栏.我也知道如何将MOC从我的mainMenu传递到另一个视图,- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender但我似乎无法弄清楚如何从appDelegate到MainViewController进行初始传递,因为两个导航控制器位于两者之间.

我已经在这个网站(和其他人)上搜索了很多线程,我只找到了"选项卡式应用程序"的解决方案,其他人希望我序列化该对象,但出于我的目的,我不能这样做.(只有少数视图会收到MOC,而其他视图会传递一个视图创建和更改的数据,以便在独特视图中针对特定目的进行定制)

非常感谢iOS和Objective-C对此nub的任何帮助.先感谢您.

编辑:我得到的错误是"由于未捕获的异常终止应用程序... [UINavigationController setManagedObjectContext]无法识别的选择器发送到实例...

delegates storyboard uinavigationcontroller moc ios

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

来自cmake的QT5生成的MOC文件中的错误

我用QT5生成了moc文件

set (CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
Run Code Online (Sandbox Code Playgroud)

然后我使用moc文件添加到SRC

SET(SRC
  src/main.cpp
  src/video_widget_surface.cpp
  src/video_widget.cpp
  src/video_player.cpp
#moc files
  moc/moc_video_player.cpp
  moc/moc_video_widget.cpp
  moc/moc_video_widget_surface.cpp
Run Code Online (Sandbox Code Playgroud)

最后我使用添加可执行文件

add_executable(somegui ${SRC})
Run Code Online (Sandbox Code Playgroud)

但我在moc文件中遇到错误说:

/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:54:6: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:62:19: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:68:20: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:68:46: error: non-member function 'const QMetaObject* metaObject()' cannot have cv-qualifier
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h: In function 'const QMetaObject* metaObject()':
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h:401:33: error: 'QScopedPointer<QObjectData> QObject::d_ptr' is protected
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:70:21: error: within this context
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h:401:33: error: invalid use of non-static data member 'QObject::d_ptr'
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:70:21: error: …
Run Code Online (Sandbox Code Playgroud)

qt cmake moc qt5

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

构建一个扩展Qt应用程序的插件

我决定将我的爱好项目应用程序(字典查找程序)切换到插件架构,以便将来为其他语言开发各种不同的字典.该应用程序是使用Qt(5.0.2)在Visual C++中开发的.我将此标头添加到应用程序代码中以定义字典插件的接口:

// dict_plugin.h
#ifndef DICT_PLUGIN_H
#define DICT_PLUGIN_H

#include <QtPlugin>

class PluginInterface
{
public:
    virtual ~PluginInterface() {}

    virtual QString language() const = 0;
    virtual class QWidget* ui() const = 0;
};

Q_DECLARE_INTERFACE(PluginInterface, "pl.ksmvision.winona.PluginInterface")

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

接下来,我从插件本身的"Qt库"模板创建了一个新项目(使用Qt Visual Studio加载项),用于制作dll.主头文件如下所示:

#ifndef JP_PLUGIN_H
#define JP_PLUGIN_H

// created by the template to define Q_DECL_EXPORT 
// and _IMPORT macros but the plugin engine takes 
// care of that (I think)
//#include "jp_plugin_global.h"

#include <QObject>
#include <QtPlugin>

#include <dict_plugin.h>

class JpPlugin : public QObject, public …
Run Code Online (Sandbox Code Playgroud)

c++ plugins qt moc

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

CMake和Qt5 AUTOMOC错误

我有一个使用Qt5的项目,并且有一个CMakeLists.txt用于创建Visual Studio解决方案的文件。

这是我的摘录 CMakeLists.txt

cmake_policy(SET CMP0020 NEW)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 REQUIRED COMPONENTS core widgets)

set(COMMON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/src)

include_directories( ${Boost_INCLUDE_DIRS}
    ${COMMON_INCLUDE_DIR}
)


file(GLOB_RECURSE COMMON_SOURCE "*.hpp" "*.cpp")
add_library(${PROJECT_NAME} ${COMMON_SOURCE})
qt5_use_modules(${PROJECT_NAME} Widgets)
Run Code Online (Sandbox Code Playgroud)

当我尝试编译代码时,它返回以下错误:

>AUTOMOC : error : C:/Users/.../Projects/MyProject/build/MyProjects_automoc.cpp The file includes the moc file "moc_MyFile.cpp", but could not find header "MyFile{.h,.hh,.h++,.hm,.hpp,.hxx,.in,.txx}" in C:/Users/.../Projects/MyProject/build/
Run Code Online (Sandbox Code Playgroud)

moc文件已自动生成,并且标题不在build文件夹中,而是在src目录中的文件夹中。

如何解决此错误?

qt cmake moc automocking qt5

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

使用不同文件夹上的文件来刷新AUTOMOC

我有一个简单的CMake项目:

proj (project folder)
??? a.h
??? a.cpp
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

的CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)

set(CMAKE_VERBOSE_MAKEFILE ON)

set(CMAKE_AUTOMOC ON)

project(proj)

set( proj_SOURCE
    a.cpp
)

find_package(Qt5Core)

set( proj_LIBRARIES
    Qt5::Core
)

add_library(proj SHARED ${proj_SOURCE})
target_link_libraries(proj ${proj_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

啊:

#pragma once

#include <QObject>

class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = 0);
};
Run Code Online (Sandbox Code Playgroud)

a.cpp:

#include "a.h"

A::A(QObject *parent) : QObject(parent)
{
}
Run Code Online (Sandbox Code Playgroud)

一切都很好.接下来,我尝试将头文件和源文件移动到不同的文件夹中,如下所示:

proj (project folder)
??? include
?   ??? a.h
??? src
?   ??? a.cpp
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

并尝试了以下调用的不同配置:

include_directories("include")
include_directories("src")

set( …
Run Code Online (Sandbox Code Playgroud)

c++ qt cmake moc

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

Q_OBJECT与否Q_OBJECT

我在main.cpp中用自己的类编写了一个小程序.这里的代码:

#include <QApplication>
#include <QPushButton>
#include <QLabel>

class MyWidget : public QWidget {
    //Q_OBJECT
public:
    MyWidget(QWidget* parent = 0);
    QLabel* label;
    QString string;

signals:
public slots:
    void setTextLabel();

};

void MyWidget::setTextLabel() {
    label->setText("Test");
}


MyWidget::MyWidget(QWidget* parent) 
     : QWidget(parent) {

}

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但不是"完全".我的插槽不起作用.我想我必须把Q_OBJECT.但是,这样做,我得到了一个错误列表,如下所示:

undefined reference to `vtable for MyWidget'
........................................
collect2: error: ld returned 1 exit status
make: *** [mywidget] Error 1
Run Code Online (Sandbox Code Playgroud)

我可以管理吗?哪里有问题?

c++ qt moc

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

QMake moc 文件被名称空间混淆

我有一个如下所示的文件:

#ifndef ENGINE_PLATFORM_AREAEDITOR_H
#define ENGINE_PLATFORM_AREAEDITOR_H

#include <QWidget>
#include "../Widgets/QtSfmlWidget.h"

namespace Engine { namespace World { class Area; } }

//This tell's Qt's qmake to ignore the code between MOC_SKIP_BEGIN and MOC_SKIP_END
// MOC_SKIP_BEGIN
#include "Engine/World/Area.h"
// MOC_SKIP_END

namespace Ui {
class AreaEditor;
}

class AreaEditor : public QWidget
{
    Q_OBJECT

public:
    Engine::World::Area area;

public:
    explicit AreaEditor(QWidget *parent = 0);
    ~AreaEditor();

    //...stuff....

private slots:
    void on_markerTextEdit_textChanged();

    void onDrawAreaScreen(sf::RenderTarget &renderTarget);
    void onDrawAreaResized(const WindowSize &windowSize);

private:
    Ui::AreaEditor *ui;

    //...stuff....
};

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

然而,当Qt生成_moc文件时,它错误地认为“AreaEditor”位于“Engine”命名空间中,从而导致编译失败。 …

qt qmake moc qt5

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