小编Rei*_*ica的帖子

C++模板typedef

我上课了

template<size_t N, size_t M>
class Matrix {
    // ....
};
Run Code Online (Sandbox Code Playgroud)

我想typedef创建一个Vector(列向量),它相当于一个Matrix大小为N和1的东西.这样的东西:

typedef Matrix<N,1> Vector<N>;
Run Code Online (Sandbox Code Playgroud)

这会产生编译错误.以下内容创建了类似的内容,但并不完全符合我的要求:

template <size_t N>
class Vector: public Matrix<N,1>
{ };
Run Code Online (Sandbox Code Playgroud)

是否有解决方案或不太昂贵的解决方法/最佳实践?

c++ templates typedef c++11

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

Q_OBJECT宏有什么作用?为什么所有Qt对象都需要这个宏?

我刚开始使用Qt并注意到所有示例类定义都将宏Q_OBJECT作为第一行.这个预处理器宏的目的是什么?

c++ macros qt

125
推荐指数
4
解决办法
7万
查看次数

如何通过成员函数指针调用?

我正在尝试使用成员函数指针进行一些测试.这段代码有什么问题?该bigCat.*pcat();声明无法编译.

class cat {
public:
   void walk() {
      printf("cat is walking \n");
   }
};

int main(){
   cat bigCat;
   void (cat::*pcat)();
   pcat = &cat::walk;
   bigCat.*pcat();
}
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers

56
推荐指数
2
解决办法
5万
查看次数

如何在基于Qt的项目中设置应用程序图标?

如何为使用Qt制作的应用程序设置应用程序图标?有一些简单的方法吗?这是一个基于qmake的项目.

c++ qt

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

如何从DLL生成导入库(LIB文件)?

是否可以从DLL自动生成MSVC导入库(LIB文件)?怎么样?

windows dll visual-c++

53
推荐指数
5
解决办法
2万
查看次数

如何使用Qt的PIMPL习语?

PIMPL代表P ointer到IMPL ementation.实现代表"实现细节":类的用户不必关心的东西.

Qt自己的类实现通过使用PIMPL惯用法将接口与实现完全分开.然而,Qt提供的机制没有记录.怎么用?

我想这是关于Qt中"我如何进行PIMPL"的规范性问题.答案将由下面显示的简单坐标输入对话框界面激发.

当我们有任何半复杂的实现时,使用PIMPL的动机就变得明显了.这个问题给出了进一步的动机.即使是一个相当简单的类也必须在其界面中引入许多其他头文件.

对话截图

基于PIMPL的接口非常干净且易读.

// CoordinateDialog.h
#include <QDialog>
#include <QVector3D>

class CoordinateDialogPrivate;
class CoordinateDialog : public QDialog
{
  Q_OBJECT
  Q_DECLARE_PRIVATE(CoordinateDialog)
#if QT_VERSION <= QT_VERSION_CHECK(5,0,0)
  Q_PRIVATE_SLOT(d_func(), void onAccepted())
#endif
  QScopedPointer<CoordinateDialogPrivate> const d_ptr;
public:
  CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0);
  ~CoordinateDialog();
  QVector3D coordinates() const;
  Q_SIGNAL void acceptedCoordinates(const QVector3D &);
};
Q_DECLARE_METATYPE(QVector3D)
Run Code Online (Sandbox Code Playgroud)

基于Qt 5,C++ 11的接口不需要该Q_PRIVATE_SLOT行.

将其与非PIMPL接口进行比较,该接口将实现细节隐藏在接口的私有部分中.请注意必须包含多少其他代码.

// CoordinateDialog.h
#include <QDialog>
#include <QVector3D>
#include <QFormLayout>
#include <QDoubleSpinBox>
#include <QDialogButtonBox>

class CoordinateDialog : …
Run Code Online (Sandbox Code Playgroud)

c++ qt pimpl-idiom

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

Qt Slots和C++ 11 lambda

我有一个QAction项目,我初始化如下:

QAction* action = foo->addAction(tr("Some Action"));
connect(action, SIGNAL(triggered()), this, SLOT(onSomeAction()));
Run Code Online (Sandbox Code Playgroud)

然后onSomeAction看起来像:

void MyClass::onSomeAction()
{
    QAction* caller = qobject_cast<QAction*>(sender());
    Q_ASSERT(caller != nullptr);

    // do some stuff with caller
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了caller对象,我可以按预期使用它.然后我尝试使用C++ 11方式连接对象,如下所示:

connect(action, &QAction::triggered, [this]()
{
    QAction* caller = qobject_cast<QAction*>(sender());
    Q_ASSERT(caller != nullptr);

    // do some stuff with caller
});
Run Code Online (Sandbox Code Playgroud)

但是caller始终为null,因此Q_ASSERT触发器.我怎样才能使用lambdas来获取发件人?

c++ qt c++11

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

QObject:无法为位于不同线程中的父级创建子级

我在Windows 7旗舰版下使用Qt 4.6.0(32位).请考虑以下事项QThread:

接口

class ResultThread : public QThread
{
Q_OBJECT

    QString _post_data;
    QNetworkAccessManager _net_acc_mgr;

signals:
    void onFinished(QNetworkReply* net_reply);

private slots:
    void onReplyFinished(QNetworkReply* net_reply);

public:
    ResultThread();

    void run();
    void setPostData(const QString& post_data);
};
Run Code Online (Sandbox Code Playgroud)

履行

ResultThread::ResultThread() : _net_acc_mgr(this)
{
    connect(&_net_acc_mgr, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(onReplyFinished(QNetworkReply*)));
}

void ResultThread::onReplyFinished(QNetworkReply* net_reply)
{
    emit onFinished(net_reply);
}

void ResultThread::setPostData(const QString& post_data)
{
    _post_data = post_data;
}

void ResultThread::run()
{
    _net_acc_mgr.post(QNetworkRequest(QUrl("http://[omitted]")),
                      QByteArray(_post_data.toStdString().c_str()));
}
Run Code Online (Sandbox Code Playgroud)

每当_net_acc_mgr.post()执行时ResultThread::run(),我在Qt Creator中获得以下应用程序输出:

QObject:无法为位于不同线程中的父级创建子级.

(Parent是QNetworkAccessManager(0x22fe58),父线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)

这是什么意思?怎么解决?

c++ qt

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

如何从QML访问C++枚举?

class StyleClass : public QObject {
public:
    typedef enum
        {
            STYLE_RADIAL,
            STYLE_ENVELOPE,
            STYLE_FILLED
        }  Style;

    Style m_style;
    //...
};
Run Code Online (Sandbox Code Playgroud)

.h文件包含上面的代码.如何通过QML访问上面的枚举?

c++ qt qml qtquick2

36
推荐指数
6
解决办法
4万
查看次数

如何在Qt,GCD风格的给定线程中执行仿函数或lambda?

在带有GCD的ObjC中,有一种在旋转事件循环的任何线程中执行lambda的方法.例如:

dispatch_sync(dispatch_get_main_queue(), ^{ /* do sth */ });
Run Code Online (Sandbox Code Playgroud)

要么:

dispatch_async(dispatch_get_main_queue(), ^{ /* do sth */ });
Run Code Online (Sandbox Code Playgroud)

[]{ /* do sth */ }在主线程的队列中执行某些操作(相当于在C++中),阻塞或异步.

我怎么能在Qt中做同样的事情?

从我所读到的,我想解决方案将以某种方式向主线程的某个对象发送信号.但是什么对象呢?只是QApplication::instance()?(那是那时生活在主线程中的唯一对象.)什么信号?


从目前的答案和我目前的研究来看,似乎我需要一些虚拟对象来坐在主线程中,有一些插槽只是等待进入某些代码来执行.

所以,我决定使用子类QApplication来添加它.我目前的代码,但不起作用(但也许你可以帮忙):

#include <QApplication>
#include <QThread>
#include <QMetaMethod>
#include <functional>
#include <assert.h>

class App : public QApplication
{
    Q_OBJECT

public:
    App();

signals:

public slots:
    void genericExec(std::function<void(void)> func) {
        func();
    }

private:
    // cache this
    QMetaMethod genericExec_method;
public:
    void invokeGenericExec(std::function<void(void)> func, Qt::ConnectionType connType) {
        if(!genericExec_method) {
            QByteArray normalizedSignature = QMetaObject::normalizedSignature("genericExec(std::function<void(void)>)");
            int …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading

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