gpt4 book ai didi

Qt 信号到特定对象的插槽

转载 作者:行者123 更新时间:2023-12-02 00:44:47 27 4
gpt4 key购买 nike

我想知道以下哪项是在 Qt 中处理信号/槽的正确方法。

我需要一种方法来拥有一个对话框的多个实例,即:AB。我需要告诉 A 从不同的线程打印“A”和 B 打印“B”。所以我相信我需要类似的东西:

选项 1) A->print("A")B->print("B")

还是这样做更好:

选项 2) emit print("A")emit print("B") 并使用我不使用的方式不知道所以只有 A 捕获“A”,只有 B 捕获“B”。

我得到的选项 1 是这样工作的:

class myClass : public QMainWindow
{
Q_OBJECT

public:
myClass (QWidget *parent = 0, Qt::WFlags flags = 0);
~myClass ();
void doPrint(char* text)
{
emit mySignal(text);
}
private:
Ui::myClass ui;

public slots:
void newLog(char* msg);

signals:
void mySignal(char* msg);
};

myClass::myClass(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags)
{
ui.setupUi(this);
connect(this, SIGNAL(mySignal(char*)), this, SLOT(newLog(char*)));
}

void myClass::newLog(char* msg)
{
ui.textEdit->append(msg);
}

然后我要做的就是:

myClass* instanceA = new myClass();
myClass* instanceB = new myClass();
instanceA->doPrint("A");
instanceB->doPrint("B");

这样对吗?

谢谢!

最佳答案

由于您的插槽在另一个线程中,您必须使用元对象系统来异步调用该方法。正确的方法是使用 QMetaObject::invokeMethod

不要继承 QThread 并覆盖 run 方法。有关详细信息,请参阅:https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

void otherClass::printTo(myClass* instance, char* text)
{
QMetaObject::invokeMethod(instance, // pointer to a QObject
"doPrint", // member name (no parameters here)
Qt::QueuedConnection, // connection type
Q_ARG(char*, text)); // parameters
}

void myClass::doPrint(char* text)
{
ui.textEdit->append(text);
}

myClass* instanceA = new myClass();
myClass* instanceB = new myClass();
printTo(instanceA, "A");
printTo(instanceB, "B");

如果 char* 类型尚未在元对象系统中注册,请使用Q_DECLARE_METATYPE(char*);

然后:

qRegisterMetaType<char*>("charPtr");

关于Qt 信号到特定对象的插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1154704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com