我必须从Qt命令提示符运行以下命令:qmake -project
然后make
这给了我带有Moc文件的调试文件夹.
奇怪的是,这是我的电脑生成moc_.cpp
文件的唯一方式.
那么如何自动执行这些命令的任务,以便我不必再次使用这些命令?
我正在尝试在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)
什么可能导致我的问题,我该如何解决?
此代码按预期编译、链接和工作:
#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) 在研究和试图弄清楚如何解决以下问题时,我已经在键盘上打了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]无法识别的选择器发送到实例...
我用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(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) 我有一个使用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目录中的文件夹中。
如何解决此错误?
我有一个简单的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) 我在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)
我可以管理吗?哪里有问题?
我有一个如下所示的文件:
#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”命名空间中,从而导致编译失败。 …