我在QT主控件mainwindow里我加了一个widget控件,我用QPainter只能在mainwindow里画直线,如何画在widget

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在QT主控件mainwindow里我加了一个widget控件,我用QPainter只能在mainwindow里画直线,如何画在widget相关的知识,希望对你有一定的参考价值。

我把widget放在groupbox控件里,如何让widget控件填充到groupbox控件?

在主程序中对painter赋widget的指针是不行的,应该需要将QWidget子类化,在子类中重写paintEvent函数。追问

能给出一个类似的demo吗?

参考技术A 没太看明白你的问题
如果是widget画的话,重写paintEvent就行了追问

mainwindow上的一个widget,我如何在widget上画直线?现在我能够实现的仅仅可以在mainwindow上画图。谢谢

当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示

【中文标题】当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示【英文标题】:QT ui not showing up when MainWindow initated from another class (not in the main function) 【发布时间】:2017-12-31 12:41:32 【问题描述】:

是否可以在 QT 中初始化 MainWindow 的对象并从另一个类调用 show 方法,例如在线程类构造函数中,然后在 main 函数中创建线程对象并启动线程?它对我不起作用(用户界面闪烁并立即消失)。有什么办法可以解决吗?如果没有,我怎样才能控制线程中的按钮和其他东西。如何通过交换数据在它们(线程和 ui 类)之间进行通信?

我的程序是这样的。线程构造函数:

#include "mainwindow.h"

void thread::thread()
    MainWindow m;
    m.show();

及主要功能:

int main(int argc,char *argv[])
    QApplication a(argc,argv);
    thread t;
    t.start();
    return a.exec();

【问题讨论】:

尝试将MainWindow m; m.show();更改为MainWindow *m = new MainWindow; m->show(); 【参考方案1】:

您可以这样做,但在此之前您必须将 MainWindow 连接到线程对象。除了修改 GUI 的 GUI 线程函数之外,您不应该从其他线程调用。

解决方案是使用插槽/信号。从线程到 UI 的所有通信始终通过槽和信号完成。

下面是一个例子:

在您的 Thread 类中创建一个名为 mySignal(); 的信号

class Thread 

...

signals:
  void mySignal();

... 

并在您的 MainWindow 中创建一个插槽

class MainWindow 

...

public slots:
 void ShowWindow();

..


在 MainWindow 类中创建一个名为 showWindow() 的函数

void MainWindow::ShowWindow() 

this->show();


将你的线程连接到主窗口

connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow);

使用emit mySignal();从你的线程调用槽

PS:您的应用程序应该是小部件应用程序而不是控制台。

【讨论】:

connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow());connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow);,是错字吗? @eyllanesc 你是对的,应该是&MainWindow::ShowWindow。我已经更正了。 我认为是因为在函数中创建的对象只存在于该函数中,最终被淘汰。您是否测试过您的解决方案? 你的代码:void MainWindow::ShowWindow() MainWindow m; m.show(); ,好像没必要,void MainWindow::ShowWindow() show(); @eyllanesc 当我写下答案时,我知道他的对象超出了范围。我什至没有提到它,因为从你的线程在堆上分配主窗口是错误的。正确的方法是使用小部件应用程序并使用从线程到 gui 线程的信号和插槽。

以上是关于我在QT主控件mainwindow里我加了一个widget控件,我用QPainter只能在mainwindow里画直线,如何画在widget的主要内容,如果未能解决你的问题,请参考以下文章

QT MainWindow 滚动条

QT控件自适应窗口大小怎么搞

如何在 Qt(或 PyQt)中将一个主窗口调用到另一个主窗口

qt 如何把qsplitter 添加到主窗口

Qt GUI 从另一个类访问 MainWindow 的最简单方法

Qt:子窗口中如何获取主窗体ui中的控件