标签: qobject

获取在应用程序中创建的所有QObject的列表

要获取在应用程序中创建的所有QWidget的列表,我们可以简单地调用QApplication::allWidgets().

我已经阅读了文档,并且我没有找到这样的内容来获取所有QObject的列表.如果应用程序创建不是QWidgets的独立QObject,我就没有这样的功能可供使用.

有没有办法获得这样的清单?

qt qwidget qobject

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

是否可以将模板派生的C++类与Qt的Q_OBJECT混合使用?

在我的应用程序中,我有以下类层次结构:

class Word
{
    ...
}

template <typename T> class Dictionary
{
    ...
};

class WordDictionary : public Dictionary<Word>
{
    Q_OBJECT

    ...
}
Run Code Online (Sandbox Code Playgroud)

WordDictionary类解析需要很长时间的字典.我正在一个单独的线程中运行解析函数,我希望它能够不时地通知GUI线程,以根据正在解析的当前行号提供进度更新.这就是我希望它成为Q_OBJECT的原因.我试图使基类Dictionary成为Q_OBJECT,但得到的消息是不支持Q_OBJECT模板.当我删除宏,只留下WordDictionary作为Q_OBJECT时,我得到一堆一般形式的错误消息:

\ GeneratedFiles \发布\ moc_dictionary.cpp(44):错误C2039: 'staticMetaObject':不是'词典'中的一员

[
T =字
]

有什么办法可以让我的模板派生的WordDictionary类成为Q_OBJECT而不是硬编码里面的模板函数,产生了很多样板代码吗?

编辑:将模板声明更改为:

template <typename T> class Dictionary : public QObject
Run Code Online (Sandbox Code Playgroud)

使代码编译.我不确定我是不是做了一些愚蠢的事情,如果能够正常工作的话.

c++ qt templates qobject

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

如何在Qt中复制对象?

我正在使用Qt并且有一些真正的基本问题.我创建了自己的具有变量的小部件MyTest obj.我需要obj从窗口小部件外部的对象设置此变量,以便复制变量而不仅仅是指向另一个对象的指针.我收到一条错误消息,无法弄清楚如何做这个基本的东西.这是我正在使用的代码:

MyTest.h:

class MyTest : public QWidget
{
    Q_OBJECT

    public:
        void setObj(QObject &inobj);

        QObject obj;
    ....
}
Run Code Online (Sandbox Code Playgroud)

MyTest.cpp:

void MyTest::setObj(QObject &inobj) {
    obj = inobj; //HERE I get the error message: "illegal access from 'QObject' to protected/private member 'QObject::operator=(const QObject &)'"
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QObject *ob = new QObject();

    MyTest w;
    w.setObj(*ob);
}
Run Code Online (Sandbox Code Playgroud)

qt copy qobject

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

Qt:使用QObject :: connect指定多个连接类型

我想知道是否可以指定多种连接类型.例如,我希望我的连接类型是排队连接和唯一连接.是否可以在一个声明中指定?

QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)
Run Code Online (Sandbox Code Playgroud)

更新:

根据海报的建议:

我试过用 Qt::QueuedConnection | Qt::UniqueConnection但是得到了

 `Error 1   error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType'
Run Code Online (Sandbox Code Playgroud)

c++ qt qobject qt-signals qtcore

10
推荐指数
2
解决办法
4277
查看次数

什么是qobject_cast?

有人可以用尽可能简单的术语(或者你想要的那么简单)qobject_cast解释它是什么,它做了什么以及为什么我们需要将一个类类型转换为另一个类?

就像,我在转换intcharQString可能使用的意义上进行类型转换QMessageBox,但为什么要投入不同的类?

c++ qt dynamic-cast qobject

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

QT:将我的域对象基于QObject是一个好主意吗?

将QT框架与C++结合使用,我有点新鲜.我想知道:将我的域类基于QObject是一个好主意吗?或者我应该只对层次结构中更高级别的类执行此操作?(更接近用户界面级别).QT文档不清楚:

摘自QT文档:

元对象系统是C++扩展,使该语言更适合真正的组件GUI编程.

显然,我希望以一种结构良好的方式构建我的应用程序.在过去的几天里,我一直在浏览QT文档,以便找到这个问题的答案.我不想犯一些基本的错误,这会使我的申请永远跛行;-).

我已经查看了QObject和Qt对象模型的基本文档.我还发现一篇新鲜的文章有帮助,但并没有真正帮助我得出结论.令我困惑的是,QT本身在这个问题上似乎并不一致,因为并非所有QT类都使用QObject作为基类.

我看到使用QObject作为基类的优点:

  • 等级制度
  • 信号和插槽
  • 属性
  • 能够使用守卫指针
  • 国际化

但是,在我的大多数域类中,我不需要任何这些功能.对此有最佳实践规则吗?或者规则是:如果您需要上述任何一点,请使用它吗?

希望我没有让这太混乱:-)

c++ qt qobject

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

QSharedPointer和QObject :: deleteLater

我有一种情况,QSharedPointer托管对象发出信号表明它已经完成了它的目的,并且很快就准备好删除了(执行后离开函数发出我的readyForDeletion信号).使用普通指针时,我只是调用QObject::deleteLater该对象,但是对于一个QSharedPointer管理实例来说这是不可能的.我的解决方法如下:

template<typename T>
class QSharedPointerContainer : public QObject
{
   QSharedPointer<T> m_pSharedObj;

public:

   QSharedPointerContainer(QSharedPointer<T> pSharedObj)
      : m_pSharedObj(pSharedObj)
   {} // ==> ctor

}; // ==> QSharedPointerContainer

template<typename T>
void deleteSharedPointerLater(QSharedPointer<T> pSharedObj)
{
   (new QSharedPointerContainer<T>(pSharedObj))->deleteLater();
} // ==> deleteSharedPointerLater
Run Code Online (Sandbox Code Playgroud)

这很好用,但是使用这种方法有很多开销(分配一个新的QObject等等).有没有更好的解决方案来处理这种情况?

c++ qt shared-ptr qobject qsharedpointer

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

当明确设置值时,什么是抑制Qt信号的正确方法

我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类.该valueChanged()信号被连接,并且在至少这三种情况下被发射:

  1. 上/下按钮
  2. 手动输入的号码
  3. setValue()

但是,在使用时setValue(),我想抑制信号,因为我不想有(三个)信号.根据我的理解,有两种方法可以解决这个问题:

  1. QObject::blockSignals()
  2. 使用一个标志来指示值是否明确设置

两种变体都有效,但我认为它们根本不是直截了当的:对于第一种,我通常会阻止所有信号,我需要blockSignals(true)为所有底层小部件设置(blockSignals不会阻止我的应用程序中的子QObject).对于第二个,我需要在每个更新方法中查询标志,并且虽然我不需要它们但信号会被提升.

是否存在阻止此类行为的一般设计模式?如果没有,您更喜欢哪种变体?

qt signals qobject

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

Qt 5将带有参数的插槽分配给QPushButton

我在C++上有一个Qt应用程序,我想为QPushButton分配一个插槽.但我想传递一些参数,因为我有多个QPushButton做类似的事情,所以我想要一个函数,但有一个参数,但Qt一直说我没有像这样的插槽.有人能告诉我为什么以及如何做到这一点?

先感谢您

在.h文件中我有:(它在开始时是私有的,但我在搜索问题时更改了它)

public slots:
    void handleButton(int row, int col);
Run Code Online (Sandbox Code Playgroud)

然后在.cpp中:

void fieldWindow::handleButton(int row, int col){
    cout << row << " " << col << endl;
}
Run Code Online (Sandbox Code Playgroud)

再次在同一个.cpp中:

connect(this->buttonsField[i][j], SIGNAL(released()), this, SLOT(handleButton(i,j)));
Run Code Online (Sandbox Code Playgroud)

这是在两个嵌套的循环,这样做ij的明确界定.

我的错误是:

QObject::connect: No such slot fieldWindow::handleButton(i,j) in ..\Proj1\fieldwindow.cpp:41
QObject::connect:  (receiver name: 'fieldWindow')
Run Code Online (Sandbox Code Playgroud)

我在互联网上读到了一些我应该说的内容handleButton(int, int);但是我应该如何传递这些论点呢?

c++ qt qobject qt5 qpushbutton

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

连接lambda时如何将Qt :: ConnectionType传递给QObject :: connect?

我将lambdas连接到QObject信号:

    QObject::connect(handle, &BatchHandle::progressMax, [this](const ProcessHandle* const self, const int value) {
        this->maxProgress(value);
    });
Run Code Online (Sandbox Code Playgroud)

上面的代码编译没有问题.

然而,Qt::QueuedConnection因为handle对象最终将移动到另一个线程,所以绝对必要.

我把它添加到我的代码中:

    QObject::connect(handle, &BatchHandle::finished, [this](const ProcessHandle* const self) {
        this->processIsRunning(false);
    }, (Qt::ConnectionType)Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)

请注意我是如何添加显式强制转换以确保它正确标识值类型的.结果:

1>src\TechAdminServices\database\techCore\processes\import\ImportManagerDialog.cpp(191): error C2664: 'QMetaObject::Connection QObject::connect<void(__cdecl taservices::ProcessHandle::* )(const taservices::ProcessHandle *),Qt::ConnectionType>(const taservices::ProcessHandle *,Func1,const QObject *,Func2,Qt::ConnectionType)' : cannot convert parameter 3 from 'taservices::`anonymous-namespace'::<lambda58>' to 'const QObject *'
1>          with
1>          [
1>              Func1=void (__cdecl taservices::ProcessHandle::* )(const taservices::ProcessHandle *),
1>              Func2=Qt::ConnectionType
1>          ]
1>          No user-defined-conversion operator available that can perform …
Run Code Online (Sandbox Code Playgroud)

c++ lambda qt signals-slots qobject

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