Leventure_轩先生 2022-12-09 15:55 采纳率: 0%
浏览 47
已结题

关于Qt中COM组件向调用组件方发送消息的问题

问题遇到的现象和发生背景

在windows中我在qt中制作了一个应用程序的com组件A,我在应用程序B中通过QObject::connect绑定了A中的信号single和应用程序B中的槽函数slot,且qDebug显示我的信号槽绑定也是正确的。在启动之后被应用程序B调用。但是在组件A的界面上点击按钮主动发送signal信号,应用程序B却并未触发slot,我该如何处理?

遇到的现象和发生背景,请写出第一个错误信息

windows开发,无错误信息

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
应用程序A COM组件
#include <ActiveQt/QAxFactory>
#include "Qt_Activex_Server.h"
Qt_Activex_Server::Qt_Activex_Server(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    connect(this, SIGNAL(addmessage(int,int)), this, SLOT(putNumber(int,int)));
    this->ui.pushButton->installEventFilter(this);
}
QAXFACTORY_DEFAULT(Qt_Activex_Server,
    "{58139D56-6BE9-4b17-937D-1B1EDEDD5B71}",
    "{B66280AB-08CC-4dcc-924F-58E6D7975B7D}",
    "{D72BACBA-03C4-4480-B4BB-DE4FE3AA14A0}",
    "{5BA077F6-8473-46F0-8611-F8E2C734232C}",
    "{F37AE7C9-934B-4180-9B46-96F672759DC4}")

void Qt_Activex_Server::IAdd(int a, int b)
{
    this->ui.lineEdit_3->setText(QString::number(a + b));
    this->emit addmessage(a, b);
    this->propertyChanged("addmessage(int,int)");
}

void Qt_Activex_Server::putNumber(int a, int b)
{
    qDebug() << a, b;
}
bool Qt_Activex_Server::eventFilter(QObject *obj, QEvent *event) {
    if (obj == this->ui.pushButton) {
        if (event->type() == QEvent::MouseButtonPress) {
            this->IAdd(this->ui.lineEdit->text().toInt(), this->ui.lineEdit_2->text().toInt());
            emit trysendname("xixihaha");
        }
    }

        return false;
}

应用程序A COM组件的Main函数

#include "Qt_Activex_Server.h"
#include "QtInterface.h"
#include "qaxfactory.h"




int main(int argc, char* argv[]) {
    QApplication a(argc, argv);
    
    if (QAxFactory::isServer()) {
        QAxFactory::stopServer();
        QAxFactory::startServer(QAxFactory::SingleInstance);
    }
    else {
        QAxFactory::startServer(QAxFactory::SingleInstance);
        Qt_Activex_Server test;
        test.show();
        return a.exec();
    }
    return 0;
    
    
}

应用程序B,调用方

#include "Qt_ComTest_Client.h"

Qt_ComTest_Client::Qt_ComTest_Client(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    
    //ax_test.setControl("1FDBE6AA-4FA0-4C3A-9E39-371248789F52");
    ax_test = new QAxWidget();
    ax_test->setControl("Qt_Activex_Server.Qt_Activex_Server.1");
    ax_test->moveToThread(QApplication::instance()->thread());
    //ax_test_event.setControl("IQt_Activex_ServerEvents");
    //ax_test.blockSignals(false);
    QString interfaces = ax_test->generateDocumentation();

    QFile docs("AX_Interfaces.html");
    docs.open(QIODevice::ReadWrite | QIODevice::Text);
    QTextStream TS(&docs);
    TS << interfaces << endl;

    //QFile docs2("AX_Interfaces_event.html");
    //docs2.open(QIODevice::ReadWrite | QIODevice::Text);
    //QTextStream TS2(&docs2);
    //TS2 << interfaces << endl;

    QVariantList params = { 100,200 };
    //ax_test->dynamicCall("IAdd(int,int)", params);
    this->ui.plainTextEdit->appendPlainText(interfaces);
    
    qDebug() << QObject::connect(ax_test, SIGNAL(addmessage(int, int)), this, SLOT(addmessages(int, int)), Qt::QueuedConnection);
    qDebug() << QObject::connect(ax_test, SIGNAL(xChanged(int)), this, SLOT(test_slot(int)), Qt::QueuedConnection);
    //qDebug() << QObject::connect(&ax_test, SIGNAL(trysendname(QString)), this, SLOT(test_slot_2(QString)), Qt::QueuedConnection);
    //qDebug() << ax_test.doVerb("IAdd(int,int)");
    //samething
    //qDebug() << QObject::connect(&ax_test, SIGNAL(signal(QString, int, void*)), this, SLOT(slot_event(QString, int , void* )), Qt::QueuedConnection);
    //qDebug() << QObject::connect(&test,SIGNAL)
}

void Qt_ComTest_Client::addmessages(int a, int b)
{
    this->ui.plainTextEdit->appendPlainText(QString::number(a + b));
}

void Qt_ComTest_Client::on_pushButton_clicked()
{
    qDebug() << "cliecked";
    QVariantList params = { 100,200 };
    ax_test->dynamicCall("IAdd(int,int)", params);
    //this->ui.plainTextEdit->appendPlainText()
}

void Qt_ComTest_Client::test_slot(int test)
{
    qDebug() << test;
}

void Qt_ComTest_Client::slot_event(QString name, int argc, void * argv)
{
    if (name == "addmessage(int,int)") {
        this->ui.plainTextEdit->appendPlainText("message received!");
    }
}

void Qt_ComTest_Client::test_slot_2(QString test)
{
    this->ui.plainTextEdit->appendPlainText(test);
}



运行结果及详细报错内容

结果就是我在组件A中点击按钮,没有我这边调试看到emit addmessage(int a,int b)都正常发送了,但是在应用B 中并未触发

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

试过很多方法了,比如从on_pushButton_click()改为eventFilter,修改connect方法,试过很多方法,但是都不行。

就是exe不行,但是dll是可以的,不知道是为什么,求各位指点一下

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

我希望就在Qt的COM组件的工作,应用程序A编写的COM组件可以被应用程序B的QAxWidget通过setControl绑定后调用,然后应用程序A也可以通过消息机制向应用程序B发送消息,我该如何做?国内资料很少,我翻了一下国内外的资料,好像没有什么很有帮助的

另外我还想问一个问题,就是我在调用方想要调用这个com组件的时候,还会再打开一个进程,但是我并不希望这样,就像我在main函数中写的那样,这样写的话会有什么问题吗?如何确认com是否能正常使用呢?

希望有经验的老哥能指点一二

  • 写回答

4条回答 默认 最新

  • 急速光粒 2022-12-09 16:32
    关注

    为什么一定要绑定外部事件呢,我觉得可以通过回调函数,将组件回调外部函数做为事件响应。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月13日
  • 赞助了问题酬金20元 12月10日
  • 修改了问题 12月9日
  • 创建了问题 12月9日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料