问题遇到的现象和发生背景
在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是否能正常使用呢?
希望有经验的老哥能指点一二