QT C++ 在子线程里使主线程创建一窗口

我的意思就是:单击一个按钮,然后运行一个自己写好继承QThread的类,然后新建了一个线程,让这个线程使主线程创建一个最简单的窗口,但我不知道该怎样写?求大家帮帮忙,我试了两天都不行,谢谢!
就是在主线程的窗口那里有个按钮,点了之后,创建了一个子线程使主线程又创建个窗口

我提供两种比较简单的解决方案
创建一个Receiver的QObject, 该对象必须生存在你继承的线程中
要么给该对象构造对应的信号, 然后与你主线程窗体进行Connect, 一般来说是Queue的Connection
然后在子线程只要Emit你所实现的信号即可

或者用postEvent来解决, 自定义一种Event, 然后持有主线程窗体对象, 然后PostEvent给主线程窗体对象追问

您能不能就第一种方法写个简短的代码模版给我看,谢谢。

追答class YourThreadImpl : public YourThread
{
private:
    //! 你主窗体对象, 在构造线程时传进来
    QObject *m_mainWindowObj;
    
public:
    void run()
    {
        //! 抛消息给你的主窗体对象,EventToLaunchNewWindow 这个事件你必须自己定义, 且主窗体必须能重写event或是其他的event filter,能识别这个事件, 在事件处理方法里面创建新窗体
        QApplication::postEvent(m_mainWindowObj, new EventToLaunchNewWindow());
    }    
};

温馨提示:内容为网友见解,仅供参考
无其他回答

QT C++ 在子线程里使主线程创建一窗口
创建一个Receiver的QObject, 该对象必须生存在你继承的线程中 要么给该对象构造对应的信号, 然后与你主线程窗体进行Connect, 一般来说是Queue的Connection 然后在子线程只要Emit你所实现的信号即可 或者用postEvent来解决, 自定义一种Event, 然后持有主线程窗体对象, 然后PostEvent给主线程窗体对象 ...

想c++在qt中实现一个界面登录的功能
connect(loginBt,&QPushButton::clicked,this,&CLoginDialog::showMainWindow); lineLayout2->addWidget(loginBt); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addLayout(lineLayout1); mainLayout->addLayout(lineLayout2); setLayout(mainLayout);}void CLoginDialog...

C#如何在子线程中创建窗体并使用?
那个窗体处于忙状态,很简单,是因为创建它的线程没有空余时间(比如一直处于忙或循环中),所以它没法响应消息。通常来说,你的做法是不可取的。因为一个线程执行完毕,它就会结束,它很少处在一个空闲状态来让窗口更新状态消息。创建窗体,建议尽量在主线程中创建。

C++程序,下面这个程序中.是创建仿真线程后,线程就直接开始运行吗...
1 假设上面的代码在主线程,BusThreadProc是子线程,可以在子线程需要访问全局资源之前加WaitForSingleObject阻塞,主线程中调用SetEvent.2 线程创建成功后,只要cpu时间片轮到子线程,就会开始执行.3 线程,事件等等都是内核对象,简单说就是句柄,一种资源,使用之后要释放.并不是刚创建就关闭线程,是你的代码这么...

在winform启动一线程,然后线程委托出来创建form并且showdialog,form显示...
异步的窗口ShowDialog是不会阻塞主窗口的,你只能在主窗口线程创建。如果一定要实现光标不能返回主窗口的逻辑,那就只能在主窗口中写一些代码来阻止主窗口被激活。例如:public partial class Form1 : Form { private Form _childForm;public Form1(){ InitializeComponent();} protected override void On...

c# 父窗口和子窗口都是同一个线程创建的吗?跨线程更新UI控件属性需要...
父窗口和子窗口都是同一个线程创建的;所谓跨线程就是在主线程中创建了已个新的线程,在新的线程中去调用主线程中的某些控件,资源等,这就是跨线程!!比如窗体中有个文本框textbox 如果你在程序中 new了一个thread,那么在这个线程thread中想去更新textbox 那么你必须需要委托来去完成 public Func<...

VS2010开发C++窗口程序,点击按钮后启动子线程,子线程处理数据后,如何将...
用全局变量来保存子线程里需要更新的值 ,创建一个互斥对象,让子线程占用互斥对象,在start函数后面waitforsingleobject,等待线程结束时释放互斥对象,这样,当waitforsingleobject获得互斥对象时,就可以更新主线程窗口了。这其实就是简单的线程同步问题。

qt如何调用子线程对象的接口
1、需要将子线程声明为主线程的友元类。2、将主线程类对象的地址通过信号槽传递给子线程中创建的对象即可。接口是一种用来定义程序的协议,描述可属于任何类或结构的一组相关行为。

各位QT大侠: QT多线程编程的时候,怎么把次线程处理好的数据实时的显示到...
Qt上要求界面处理一般需要在主线程中完成。所以最好把次线程中的数据缓冲区放到主线程中:1、一种方式可以进行数据拷贝,但肯定效率低了。2、另一种方式是直接将数据缓冲区放到主线程中,然后在主线程中处理读取数据槽。但这样可能主线程压力大,机器配置不能太低。3、直接在主线程中访问次线程的数据并刷新界面,不过...

子线程如何不阻塞主线程
这个很简单,在主程序里把那个子函数变成一个线程就可以了。这样那个子函数线程会等a任务线程完成后自己结束的。假设你原来的程序是这样的:void main(){ func();} void func(){ ...pthread_create(&thr,NULL,aFunc,NULL);pthread_join(thr,NULL);} 那么现在把子函数变成线程:void main(){ ....

相似回答