特别是,我正在为QWizard实现一个QWizardPage("MyWizardPage"),我想从我的QWizardPage :: nextId虚拟方法的覆盖中发出一个信号("sigLog").
像这样:
class MyWizardPage
: public QWizardPage
{
Q_OBJECT
public:
MyWizardPage();
virtual int nextId() const;
Q_SIGNALS:
void sigLog(QString text);
};
int MyWizardPage::nextId() const
{
Q_EMIT sigLog("Something interesting happened");
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这个时,我在Q_EMIT行上得到以下编译错误:
错误1错误C2662:'MyWizardPage :: sigLog':无法将'this'指针从'const MyWizardPage'转换为'MyWizardPage&'
问题只是出于教育目的:
在两个对象(例如两个线程)之间使用30-50或更多对信号和插槽是否会影响应用程序性能,运行时或响应时间?
是否可以在没有接收器实例的情况下将信号连接到静态插槽?
像这样: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));
QApplication::closeAllWindows()Qt文档中有一个带有[static slot]属性的函数.并且有一个从文档中使用它的示例:
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
Run Code Online (Sandbox Code Playgroud)
是否允许执行相同的操作但不传递实例变量(例如,当类只有静态函数时)?
class Some : public QObject {
Q_OBJECT
public slots:
static void foo();
private:
Some();
};
Run Code Online (Sandbox Code Playgroud)
也许Frank Osterfeld是对的,在这种情况下最好使用单例模式但我仍然感到惊讶为什么这个功能还没有实现.
更新:
使用moveToThread在Qt中将对象从一个线程移动到另一个线程是什么意思?甚至在使用moveToThread之前,一切似乎都工作,moveToThread将对象从一个线程(GUI线程)移动到另一个线程(工作),Qt:connect调用对象上的相应插槽.
由于对象所在的位置,GUI线程或工作线程,有什么区别吗?
编辑:我做了一个小程序,但我不明白QThread如何与Signal和插槽功能一起工作,如果你能解释一下moveToThread的用法,我将不胜感激
#include <QtGui/QApplication>
#include <QPushButton>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QString>
#include "mythread.h"
//GUI calls a thread to do some job and sub update the text box once it is done
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QHBoxLayout * pH = new QHBoxLayout(&w);
QPushButton * pushButton = new QPushButton("asdad");
QLineEdit * lineEdit = new QLineEdit("AAA");
pH->addWidget(pushButton);
pH->addWidget(lineEdit);
w.setLayout(pH);
w.show();
MyThread thread;
qDebug("Thread id %d",(int)QThread::currentThreadId());
QObject::connect(pushButton,SIGNAL(clicked()),&thread,SLOT(callRun())) ;
QObject::connect(&thread,SIGNAL(signalGUI(QString)),lineEdit,SLOT(setText(QString)));
return a.exec();
}
#ifndef MYTHREAD_H
#define …Run Code Online (Sandbox Code Playgroud) 我的Qt应用程序有问题.我正试图从另一个类中发出一个信号(它是放置信号的嵌套类).
我已经将信号连接到一个插槽,应该没问题.但是当我尝试从这个嵌套类中发出这个信号时,我得到编译器错误:
没有对象就无法调用成员函数
怎么了?我在Qt文档中找到了它,但找不到合理的解决方案甚至解释.
简化的类定义如下所示.
class LogWriter : public QDialog
{
Q_OBJECT
public:
class Log : public QObject
{
Q_OBJECT
public:
bool print;
Log(bool _print, QString _color, QObject *obj = NULL)
: QObject(obj)
{
print = _print;
color = _color;
}
};
LogWriter(QWidget * parent = 0);
~LogWriter();
public slots:
void setMinVal();
void setMediumVal();
void setHighVal();
void cleanWindow();
void appendText(QString &text);
signals:
void signalLogAppend(QString);
};
Run Code Online (Sandbox Code Playgroud)
我LOW使用以下函数调用将客户端代码中LogWriter 实例的信号连接到某个插槽:
connect(&LOW, SIGNAL(signalLogAppend(QString)),
this, SLOT(appendText(QString&)),
Qt::DirectConnection);
Run Code Online (Sandbox Code Playgroud) 我已将自己注入Qt应用程序,我试图找出给定插槽连接的信号,但无法找到有关此操作的任何信息.是否有开箱即用的机制?如果是这样,这是否暴露于QtScript?(如果没有,我可以很容易地包装它.)
如果没有这样的机制,那么添加它的最佳方法是什么?我无法在简单的钩子之外操纵现有的应用程序,但我可以自己挂钩QObject :: connect并存储连接,只是不确定这是否是最好的方法.
这是我从来没有用const-ref得到的东西,我真的希望有人可以向我解释.
当调用另一个函数内部的函数时,我得到的const-ref是传递我不打算篡改的堆栈对象的最佳方法.例如:
void someInnerFunction(const QString& text) {
qDebug() << text;
}
void someFunction() {
QString test = "lala";
....
someInnerFunction(test);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我觉得这么好.但信号怎么样?传递参考文件是否存在任何风险?即便如此const.感觉就像我一直在阅读关于const-ref的所有文档,但我仍然觉得有点冒险,因为我将其理解为"发送一个对象的引用并保持它const".如果它所指的对象超出范围怎么办?
例如:
void someFunction() {
connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&)));
QString test = "lala";
emit someSignal(test);
// doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied.
}
void someSlot(const QString& test) {
qDebug() << test; // will this work?
}
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?我经常在函数调用中使用const-ref,我只想访问该对象但不更改它.但信号怎么样?大多数信号在Qt doc中似乎都有const-ref parm,但它是如何工作的?
c++ qt signals-slots const-reference pass-by-const-reference
在C++中,public意味着可以从对象可见的任何位置访问的成员,private意味着成员只能从同一类的其他成员或其朋友中访问.
但在Qt中,差异private slots并且public slots似乎并不存在.我最近几天开始写Qt,而且我private slots一直都在使用.
有人告诉我应该用public slots.所以现在我很困惑.我在Qt的文档中找不到参考信息.
两种类型之间的实际差异是什么?
根据文档,插槽的返回值并不意味着什么.
然而在生成的moc代码中,我看到如果一个槽返回一个值,则该值用于某些东西.知道它做了什么?
这是我正在谈论的一个例子.这是从moc生成的代码中获取的.'message'是一个不返回任何内容的插槽,'selectPart'被声明为返回int.
case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break;
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])));
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
Run Code Online (Sandbox Code Playgroud) 我可以使用以下代码(在连接到myQtSignal的最终插槽中)有一个"悬空参考"吗?
class Test : public QObject
{
Q_OBJECT
signals:
void myQtSignal(const FooObject& obj);
public:
void sendSignal(const FooObject& fooStackObject)
{
emit myQtSignal(fooStackObject);
}
};
void f()
{
FooObject fooStackObject;
Test t;
t.sendSignal(fooStackObject);
}
int main()
{
f();
std::cin.ignore();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
特别是如果在同一个线程中没有执行emit和slot.