• 1820阅读
  • 9回复

Qt生成的dll使用(求助) [复制链接]

上一主题 下一主题
离线winston_zbb
 

只看楼主 正序阅读 楼主  发表于: 2020-10-14
由于项目需要,先需要使用qt生成dll文件,供C#调用,目前在使用connect中遇见问题! 我的程序在qt上运行时,按照设计的想法,执行了槽函数。但是在C#调用qt生成的dll文件时,并没有执行槽函数,不知道是没有触发,还是没有connect成功,有遇见这种情况的么?该如何解决这个问题!
在线圣域天子

只看该作者 9楼 发表于: 2020-10-19
回 winston_zbb 的帖子
winston_zbb:好的,多谢!还想请教您一下,您在实际使用过程中,除了信号和槽不能使用,其它的功能有没有不能使用的!? (2020-10-19 15:15) 

发现过某些函数偶尔会不工作,比如 select() 函数,原因不明。
一下子想不起来多少,原来发现过超过10条
注意有些内部使用信号槽的类都不能使用的
离线winston_zbb

只看该作者 8楼 发表于: 2020-10-19
回 圣域天子 的帖子
圣域天子:主动读写,我以往是用个子线程进行处理的 (2020-10-19 13:26) 

好的,多谢!还想请教您一下,您在实际使用过程中,除了信号和槽不能使用,其它的功能有没有不能使用的!?
在线圣域天子

只看该作者 7楼 发表于: 2020-10-19
回 winston_zbb 的帖子
winston_zbb:您好,我想使用QSerialPort这个类,实现接收串口数据,不用信号和槽,有没有比较好的方法。如果我只定义了一个类,如何对类进行实例化 (2020-10-19 08:11) 

主动读写,我以往是用个子线程进行处理的
离线winston_zbb

只看该作者 6楼 发表于: 2020-10-19
回 圣域天子 的帖子
圣域天子:Qt也需要先启动消息循环才能用信号槽,其它语言调用Qt的DLL时,一般是不能用信号槽的。
除非先实例化QXXXXXApplication  (2020-10-18 13:05) 

您好,我想使用QSerialPort这个类,实现接收串口数据,不用信号和槽,有没有比较好的方法。如果我只定义了一个类,如何对类进行实例化
在线圣域天子

只看该作者 5楼 发表于: 2020-10-18
Qt也需要先启动消息循环才能用信号槽,其它语言调用Qt的DLL时,一般是不能用信号槽的。
除非先实例化QXXXXXApplication
离线winston_zbb

只看该作者 4楼 发表于: 2020-10-15
回 lanmanck 的帖子
lanmanck:上代码,connect有返回值 (2020-10-15 09:26) 

您看一下我的含有代码的回复,我在界面类中调用成功,但是我直接使用类,就失败,不知道什么原因
离线winston_zbb

只看该作者 3楼 发表于: 2020-10-15
回 272064949 的帖子
272064949:
其他功能没有问题的话, 有没有可能是qt的事件没有开启, 就是qt的main里的a.exec(), 因为你是用c#调用dll, 所以没有这几行代码。如果没有跨线程的话, 试试用c++11的方式使用看行不行,
connect(obj, &ojb::sig, [=](){
});


我定义了一个类,类里面有一个connect ,具体如下:
.h
class testTimer : public QObject
{
    Q_OBJECT
public:
    explicit testTimer(QObject* parent = nullptr);
    QTimer *testtimer = new QTimer();
    int value1 = 0;
private slots:
    void calTest();
};

.cpp
testTimer::testTimer(QObject *parent) : QObject(parent)
{
    connect(testtimer,&QTimer::timeout,[=]()    {        value1= value1+1;    });  
    testtimer->start(1000);
}
void testTimer::calTest()
{
    value1 = value1+1;
}
我使用了两种方法调用 方法一 : 我生成dll文件中调用
testTimer *test11 = new testTimer();
extern "C" __declspec(dllexport)
int connect1();int connect1()
{    //qApp->exec();  
     return test11->value1;
   //return currentcon->on_connect();
}
方法二 我使用了别人做的使C#调用的界面类
testTimer *currenttest = new testTimer();
ui->doubleSpinBox->setValue(currenttest->value1);
结果是 第一种方法 结果一直为0,第二种方法 结果与预期符合,一直在变化


离线272064949

只看该作者 2楼 发表于: 2020-10-15
其他功能没有问题的话, 有没有可能是qt的事件没有开启, 就是qt的main里的a.exec(), 因为你是用c#调用dll, 所以没有这几行代码。如果没有跨线程的话, 试试用c++11的方式使用看行不行,
connect(obj, &ojb::sig, [=](){
});
离线lanmanck

只看该作者 1楼 发表于: 2020-10-15
上代码,connect有返回值
精彩博客:labisart.com
快速回复
限100 字节
 
上一个 下一个