【问题标题】:Application crashes when adding QWidget obtained from shared library to QTabWidget将共享库获取的 QWidget 添加到 QTabWidget 时应用程序崩溃
【发布时间】:2017-06-11 10:43:32
【问题描述】:
//the subclass of widget in shared library  
class MYWIDGETSHARED_EXPORT MyWidget : public QWidget  
{
    Q_OBJECT     
public:    
    MyWidget(QWidget *parent = 0);    
    void do_something();   
};

extern "C"{  
    MYWIDGETSHARED_EXPORT MyWidget *getMyWidget(){ return new MyWidget;}  
}


//the application which will use the shared library  
void MainWindow::creatCentralWidget()  
{  
    QTabWidget *tabWidget = new QTabWidget(this);    
    QLibrary myLib("xxx/MyWidget.dll");  
    if(myLib.load()){       
        MyWidget *widget = (MyWidget*)myLib.resolve("getMyWidget");  
        tabWidget->addTab(widget,"MyWidget");//Here cause crash!     
    }  
   //.......do_something()......
}  

当我将MyWidget 添加到tabWidget 时,应用程序因代码255 而崩溃。

我已经设置了LIBS,INCLUDEPATH,DEPENDPATH,好像没有问题。

所以我想知道,如何将共享库中的小部件正确嵌入到QTabWidget?谢谢!

【问题讨论】:

  • 在类定义中添加 Q_OBJECT
  • 对不起,我忘了在这段代码中写“Q_OBJECT”,但它也不起作用。
  • widget的值是多少?

标签: qt shared-libraries qtabwidget


【解决方案1】:

由于您使用了以下演员阵容,您有未定义的行为...

MyWidget *widget = (MyWidget*)myLib.resolve("getMyWidget");

getMyWidget 的正确类型是...

MyWidget *(*)()

您需要解析符号并然后调用它...

typedef MyWidget *(*get_my_widget_type)();
if (get_my_widget_type get_my_widget = get_my_widget_type(myLib.resolve("getMyWidget"))) {
  MyWidget *widget = get_my_widget();
  tabWidget->addTab(widget, "MyWidget");
}

【讨论】:

  • 成功了,非常感谢。我想我犯了一个愚蠢的错误!我没有阅读文档。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多