要获取在应用程序中创建的所有QWidget的列表,我们可以简单地调用QApplication::allWidgets().
我已经阅读了文档,并且我没有找到这样的内容来获取所有QObject的列表.如果应用程序创建不是QWidgets的独立QObject,我就没有这样的功能可供使用.
有没有办法获得这样的清单?
在我的应用程序中,我有以下类层次结构:
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)
使代码编译.我不确定我是不是做了一些愚蠢的事情,如果能够正常工作的话.
我正在使用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) 我想知道是否可以指定多种连接类型.例如,我希望我的连接类型是排队连接和唯一连接.是否可以在一个声明中指定?
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) 有人可以用尽可能简单的术语(或者你想要的那么简单)qobject_cast解释它是什么,它做了什么以及为什么我们需要将一个类类型转换为另一个类?
就像,我在转换int为char或QString可能使用的意义上进行类型转换QMessageBox,但为什么要投入不同的类?
将QT框架与C++结合使用,我有点新鲜.我想知道:将我的域类基于QObject是一个好主意吗?或者我应该只对层次结构中更高级别的类执行此操作?(更接近用户界面级别).QT文档不清楚:
摘自QT文档:
元对象系统是C++扩展,使该语言更适合真正的组件GUI编程.
显然,我希望以一种结构良好的方式构建我的应用程序.在过去的几天里,我一直在浏览QT文档,以便找到这个问题的答案.我不想犯一些基本的错误,这会使我的申请永远跛行;-).
我已经查看了QObject和Qt对象模型的基本文档.我还发现一篇新鲜的文章有帮助,但并没有真正帮助我得出结论.令我困惑的是,QT本身在这个问题上似乎并不一致,因为并非所有QT类都使用QObject作为基类.
我看到使用QObject作为基类的优点:
但是,在我的大多数域类中,我不需要任何这些功能.对此有最佳实践规则吗?或者规则是:如果您需要上述任何一点,请使用它吗?
希望我没有让这太混乱:-)
我有一种情况,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等等).有没有更好的解决方案来处理这种情况?
我从QWidget派生类获得了一个包含三个QSpinBox(例如坐标)的类.该valueChanged()信号被连接,并且在至少这三种情况下被发射:
setValue()但是,在使用时setValue(),我想抑制信号,因为我不想有(三个)信号.根据我的理解,有两种方法可以解决这个问题:
QObject::blockSignals() 两种变体都有效,但我认为它们根本不是直截了当的:对于第一种,我通常会阻止所有信号,我需要blockSignals(true)为所有底层小部件设置(blockSignals不会阻止我的应用程序中的子QObject).对于第二个,我需要在每个更新方法中查询标志,并且虽然我不需要它们但信号会被提升.
是否存在阻止此类行为的一般设计模式?如果没有,您更喜欢哪种变体?
我在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)
这是在两个嵌套的循环,这样做i和 j的明确界定.
我的错误是:
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);但是我应该如何传递这些论点呢?
我将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) qobject ×10
qt ×10
c++ ×7
copy ×1
dynamic-cast ×1
lambda ×1
qpushbutton ×1
qt-signals ×1
qt5 ×1
qtcore ×1
qwidget ×1
shared-ptr ×1
signals ×1
templates ×1