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

关于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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 已结题 12月13日
      • 赞助了问题酬金20元 12月10日
      • 修改了问题 12月9日
      • 创建了问题 12月9日

      悬赏问题

      • ¥15 在python中如何把字典转换为csv
      • ¥15 matlab数据信号处理问题
      • ¥15 为什么Js中函数还可以有实例对象?
      • ¥15 一块长方形的大布料截取若干个小的长方形布料,小长方形布料不能旋转,怎么使组成的不规则图形的长度最小?
      • ¥15 iPhone13视频通话屏幕闪黑
      • ¥15 linux平台中qt5对触屏操作偶尔不响应
      • ¥15 不使用zk实现双机clickhouse、kafka数据同步
      • ¥15 使用Labwindows/CVI程控万用表时自动切换量程
      • ¥15 Matlab修改xml参数后允许不了exe文件
      • ¥15 用flask框架接收前端上传的文本文件后怎么读取该文件