• 4061阅读
  • 14回复

[提问]关于UI界面无法启动的问题 [复制链接]

上一主题 下一主题
离线vitty1984
 

只看楼主 倒序阅读 楼主  发表于: 2012-02-23
我在一个命令行程序里面调用一个动态库,这个动态库的的作用是调用另外一个动态库,会起一个界面,但是这样貌似不行,程序会core掉,我查了一下core文件,发现是core在qt源码中qwidget.cpp中
#ifndef QT_NO_THREAD
    if (!q->parent()) {
        Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
                   "Widgets must be created in the GUI thread.");
    }
#endif
我的程序并不是多线程的,这是怎么回事啊
离线wxj120bw

只看该作者 1楼 发表于: 2012-02-23
回 楼主(vitty1984) 的帖子
将含有界面动态库用moveToThread函数指定到主线程里
离线vitty1984

只看该作者 2楼 发表于: 2012-02-23
能说的详细点吗,谢谢了
离线wxj120bw

只看该作者 3楼 发表于: 2012-02-23
回 2楼(vitty1984) 的帖子
qt的所有QWidget要放到主线程里 因为主事件循环的问题 你是通过调用两次动态库启动的界面 很可能已经被qt内部做成了多线程 那么在动态库中将界面的用moveToThread函数移动主线程里
PS:没有尝试过,不能保证一定能启动界面  
离线vitty1984

只看该作者 4楼 发表于: 2012-02-23
调用UI的代码如下
bool QtTestRunner::run( bool ifAutoRun )
{
m_dlg = new QtTestRunnerDlgImpl( this, qApp->mainWidget(), m_runnerName.c_str(), TRUE );
}
其中QtTestRunner和QtTestRunnerDlgImpl都是一个程序里面的cpp,程序就会core在new的过程中
离线wxj120bw

只看该作者 5楼 发表于: 2012-02-23
回 4楼(vitty1984) 的帖子
这是你含有界面动态库的代码吗
离线vitty1984

只看该作者 6楼 发表于: 2012-02-23
是的,但是调用run函数的是另外一个动态库调用的
离线wxj120bw

只看该作者 7楼 发表于: 2012-02-23
回 6楼(vitty1984) 的帖子
参考下面函数手册 将QWidet对象移动到主线程里
void QObject::moveToThread ( QThread * targetThread )
离线vitty1984

只看该作者 8楼 发表于: 2012-02-23
主要是我这个QWidget对象在初始化的时候就core掉了,没办法用moveToThread函数啊
离线wxj120bw

只看该作者 9楼 发表于: 2012-02-23
回 8楼(vitty1984) 的帖子
那你把QtTestRunner移到主线程里
离线vitty1984

只看该作者 10楼 发表于: 2012-02-23
QtTestRunner是一个接口类,不少QObject对象,没有办法调用moveToThread函数啊
离线wxj120bw

只看该作者 11楼 发表于: 2012-02-23
回 10楼(vitty1984) 的帖子
接口类QtTestRunner继承QObject类 会有异常吗
离线vitty1984

只看该作者 12楼 发表于: 2012-02-23
这样貌似也不行
离线wxj120bw

只看该作者 13楼 发表于: 2012-02-23
回 12楼(vitty1984) 的帖子
方便的法 发过来看看
离线vitty1984

只看该作者 14楼 发表于: 2012-02-23
你邮箱是多少啊,或者QQ号
快速回复
限100 字节
 
上一个 下一个