如何将 Qline 坐标发送到 QPainter 小部件

2023-11-29

我创建了一个 Qwidget Form_temp,它根据父窗口小部件 MainWindow 中创建的数据数组绘制线条。我面临的问题是我通过槽 send_data 从 MainWindow 发送到 Form_temp 的数据不被 Form_temp 中的其他函数看到。 (绘画事件)。

我无法找出漏洞。我添加了一些调试点来验证数据是否到达 Form_temp。

这是带有一些解释的代码。我用 QTCreator 做了这个,请帮忙,我花了几天时间在这上面,但无法继续。

另一个问题:每次用户移动鼠标或另一个小部件更新其视图时,paintEven都会发生(例如,我有一个显示时间的标签)。我想过滤 QPaintevens,我只想在数据更改时进行更新。有没有比我编写的代码更好的方法来做到这一点?

QWidget:标题

    #ifndef FORM_TEMP_H
    #define FORM_TEMP_H
    #include <QWidget>
    #include <QDebug>

    namespace Ui { class Form_temp;   }

    class Form_temp : public QWidget        {
        Q_OBJECT
    public:
        QPainter *p;
        void paintEvent(QPaintEvent*);
        explicit Form_temp(QWidget *parent = 0);
        ~Form_temp();
        void send_data (int *parray, int asize);

        int array[48];
        int size;
        bool myupdate;

    private:
        Ui::Form_temp *ui;
    };

    #endif // FORM_TEMP_H

QWidget:核心

#include "form_temp.h"
#include "ui_form_temp.h"
#include <cstdlib>
#include <QPainter>
#include <QDebug>

Form_temp::Form_temp(QWidget *parent) : QWidget(parent), ui(new Ui::Form_temp) {
    myupdate = false;
    ui->setupUi(this);
}
Form_temp::~Form_temp() { delete ui; }

void Form_temp::paintEvent(QPaintEvent*) {
    qDebug("Paintevent occurs");
    if (myupdate) {     // Event happen whenever I move the mouse,
                        // I only want an update when data changes.
      p = new QPainter(this);
      QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
      p->setPen(pen);
      p->setRenderHint(QPainter::Antialiasing,true);

      qDebug()<< "this size" <<size;        
      for (int i= 0; i< size; ++i) {
         qDebug()<< "array[i" <<i <<"]="<< array[i];
      }
      [...]
      p->drawLine(x1,y1,x2,y2);
      [...]
    }
myupdate = false;  
}

void Form_temp::send_data (int *parray, int asize){
    size = asize;
     for (int i= 0; i< asize; ++i) {array[i] = parray[i];}
     myupdate = true;  // make sure the event will update the drawing
     this->update();   // create a Qpaint Event

     qDebug()<< size;  // print the data so we know we are passing data correctly
     for (int i= 0; i< asize; ++i) {
        qDebug()<< "array[i" <<i <<"]="<< array[i];
     }
}

主窗口:标题

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QtGui>
    #include "gpio.h"
    #include "form_temp.h"
    namespace Ui {
        class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        //QPropertyAnimation *m_ani ;
        //QPropertyAnimation *m_ani2 ;
        Form_temp *temp_graph;
    [...]
    #endif // MAINWINDOW_H

主窗口:核心

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){

        // Start UI
        ui->setupUi(this);

        temp_graph = new Form_temp;
        startTimer(1000); // get timer event every sec.

   }

   void MainWindow::timerEvent(QTimerEvent *event)  {

      int data[]= {1,2,3};
      temp_graph->send_data(data, 3);
   }
  [...]

谢谢阅读。塞巴斯蒂安.


评估此处发布的代码非常困难。

看来您创建了QWidget子类,Form_temp,使用 Qt Designer,这意味着它有一些实际上并不需要的额外设计时包袱。

当您创建实例时Form_temp,你没有设置MainWindow作为构造函数中的父级,所以我不太确定您的自定义小部件将如何绘制自身,因为它从未收到对show()本身。它也从未被破坏。

使用插槽和实现所需的接线也不存在,因此无法确定在这种情况下这是否是问题区域。

不过,您应该可以实现您的目标:) 我强烈建议您查看Qt 模拟时钟示例因为这很好地演示了如何实现您自己的小部件。

您提到您只希望您的小部件在更改数据时自行更新,但您误解了 Qt 框架的运行方式。您希望您的小部件在更改数据时自行绘制,但这并不是小部件需要绘制自身的唯一一次,因此您不应尝试以这种方式限制绘制操作。

将代码放入paintEvent()这将根据当前数据按照您希望的方式绘制整个小部件。该框架将执行paintEvent()当小部件第一次出现时,当它之前被另一个窗口遮挡后显示出来时,以及许多其他您无法控制的情况时。

添加普通方法(不需要槽),允许您从类外部更改基础数据,并确保这些方法包含对update()在它们的末尾,这样它们就会向框架发出信号,表明应该重新绘制小部件。

如果您的小部件很复杂并且绘制速度很慢,您可以查看传入的事件中指定的区域paintEvent()将您的绘制代码限制为仅需要更新的区域。

UPDATE:

你的代码很接近。我已将其精简为最基本的内容以演示基础知识。您应该能够根据您的需要对其进行详细说明。

main.cpp

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

主窗口.h

#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

#include "Form_temp.h"

#include <QWidget>
#include <QTimer>

class MainWindow : public QWidget
{
    Q_OBJECT
public:
    MainWindow();
    virtual ~MainWindow();

private:
    Form_temp *temp_graph;   
    QTimer m_timer;

private slots:
    void slot_timeout();

};

#endif  /* _MAINWINDOW_H */

main.cpp

#include "MainWindow.h"

MainWindow::MainWindow():
    temp_graph(0),
    m_timer(this)
{
    temp_graph = new Form_temp(this);
    connect(&m_timer, SIGNAL(timeout()), this, SLOT(slot_timeout()));
    m_timer.start(1000);
}

MainWindow::~MainWindow()
{
}

void MainWindow::slot_timeout()
{
    int y = temp_graph->getY();

    y++;
    if(y > 10)
    {
        y = 0;
    }

    temp_graph->setY(y);
}

表单_temp.h

#ifndef _FORM_TEMP_H
#define _FORM_TEMP_H

#include <QWidget>

class Form_temp : public QWidget
{
    Q_OBJECT
public:
    Form_temp(QWidget *parent = 0);
    virtual ~Form_temp();

    void setY(const int newY);
    int  getY();

protected:
    void paintEvent(QPaintEvent *event);

private:
    int m_y;
};

#endif  /* _FORM_TEMP_H */

表单_temp.cpp

#include "Form_temp.h"
#include <iostream>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>

using namespace std;

Form_temp::Form_temp(QWidget *parent) :
    QWidget(parent),
    m_y(1)
{
    cout << "Form_temp created." << endl;
}

void Form_temp::setY(const int newY)
{
    m_y = newY;
    update();
}

int Form_temp::getY()
{
    return m_y;
}

Form_temp::~Form_temp()
{
    cout << "Form_temp destroyed." << endl;
}

void Form_temp::paintEvent(QPaintEvent *event)
{
    cout << "Form_temp paintEvent." << endl;

    QPainter p(this);

    QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
    p.setPen(pen);
    p.setRenderHint(QPainter::Antialiasing, true);

    p.drawLine(0, m_y, width(), m_y);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Qline 坐标发送到 QPainter 小部件 的相关文章

  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • 使用最近邻缩放图像

    我一直在尝试让我的程序放大图像 我在为缩放图像分配新空间时遇到一些问题 但我认为它已经解决了 我遇到的问题是 当我尝试从临时内存持有者发回图像时 程序崩溃了 加载的图像放置在我的struct Image 像素被放置在img gt pixel
  • jQuery:查找特定父级之前的所有父级

    jQuery 中是否有一个内置函数可以让我将所有父级添加到具有特定 ID 的父级 我有一个深度嵌套的无序列表 如果我有对 li 之一的引用 我需要找到所有父 li 直到根 ul 如果我使用parents 它会给我所有的父母直到文档的根目录
  • 使用 iPhone sdk 编辑 PDF

    我想在现有的 pdf 上添加一些图像 单击这些图像后我应该能够 显示一些动画或能够播放音乐 是否可以这样做 我使用 pageCurlUp 动画逐页显示 pdf 但我不知道如何使用外部图像显示 pdf 不同页面和不同位置会有不同的图像 请指导
  • 当不通过 ObjectMapper 时,如何在 JsonParser 上设置 ObjectCodec?

    注意 这是使用 Jackson 2 3 2 为了满足我的一个项目的需要 我正在编写一个自定义的JsonParser其中记录了一个Map钥匙在哪里JsonPointers 和值是Integers 指针指向的行号 该类被命名为LineRecor
  • Ionic 3 延迟加载使大型 html 文件出现滞后

    我在我的项目中使用 ionic 3 但在延迟加载方面遇到了一些问题 我有一个ResultPage与模板resultpage html有超过1000html 行代码 在里面HomePage我想导航到ResultPage by navCtrl
  • Bash - 简单问号(?)的含义

    我正在尝试一些 bash 功能 当我尝试回显一些输出时 我注意到 echo what about in some more complex example 结果是 在一些更复杂的例子中怎么样 我知道转义问号或整行引号可以解决问题 但我很好奇
  • Xcode 未找到匹配的私钥

    我有一个从另一台 Mac 分发的应用程序 我需要从另一台 Mac 获得什么才能将我的应用程序存档以供上传 以及我需要在 Xcode 路径中进行哪些更改才能使所有工作正常进行 谢谢 抱歉英语不好 如果您使用某人的证书 您还必须获取与该证书关联
  • 什么是词向量维度

    我目前是深度学习的业余爱好者 正在这个网站上阅读有关 word2vector 的内容https www kaggle com c word2vec nlp tutorial details part 3 more fun with word
  • 是否有一个函数可以在给定索引号的情况下生成特定的 n Multichoose r 组合?

    例如 3 multichoose 2 有以下组合 i combo 0 0 0 1 0 1 2 0 2 3 1 1 4 1 2 5 2 2 是否可以编写一个参数为 n r i 的函数并返回有问题的组合 而不迭代之前的每个组合 是否可以编写一个
  • 从控制器 CakePHP 3.x 执行 shell

    我在 CakePHP Shell 中有一个特定任务 它由 CRON 作业执行 但我希望用户能够随时从网络界面 如按钮或类似的东西 执行它 所以 我的问题是 是否可以从控制器执行 shell 在控制器中模拟这一点 bin cake MyShe
  • 获取两个地理点之间的距离

    我想制作一个应用程序来检查用户所在的最近位置 我可以轻松获取用户的位置 并且我已经有了带有纬度和经度的地点列表 了解列表中与当前用户位置最近的位置的最佳方法是什么 我在 google API 中找不到任何内容 Location loc1 n
  • Laravel 如何处理 PHP 警告?

    我正在尝试使用 Laravel 连接到 LDAP 服务器 重要的是我正在使用 PHP 函数ldap connect and ldap bind而不是使用包来处理它 关键是当我提供错误的用户名和密码时 ldap bind函数给我们一个 PHP
  • “*apply”家族真的没有矢量化吗?

    所以我们习惯对每个 R 新用户说 apply没有矢量化 看看 Patrick BurnsR地狱圈 4 其中说 我引用 常见的反应是使用 apply 系列中的函数 这不是 向量化 它是循环隐藏的 apply 函数有一个 for 循环 它的定义
  • 将数据发送到另一个可能启动的活动

    我有一个 BroadcastReceiver 用于将数据发送到另一个可能正在运行或未运行的活动 我在 onReceive 方法中使用意图 并 使用 putExtra 将数据放入 数据被发送到活动 但是 即使活动已经在前台运行 活动的 onC
  • 如何在 Eclipse 中强制设置 JFace 向导的最小高度?

    我正在呈现一个向导 代码here 的值太低 因此内容无法完全显示 请参见下面的屏幕截图 如何强制向导具有最小高度 根据上的回答这个问题在 StackOverflow 上 向导将与向导中最大的向导页具有相同的高度 但我的向导显然不会至少根据c
  • 如何将二维数组传递给C中的函数?

    我的函数原型是 int rotate int arr int row int col int fl where arr是二维数组 row and col分别是二维数组的行数和列数 fl是一个标志变量 如果值fl is 0那么数组将向右旋转
  • ipython:操作错误:磁盘 I/O 错误

    到目前为止 我一直在 fedora 18 上成功运行 ipython 尝试启动它时出现以下异常 Traceback most recent call last File usr bin ipython line 9 in
  • 无法使用jsoup登录网站

    我正在尝试登录这个网站 这是我到目前为止所尝试过的 但它似乎不起作用 try Connection Response login Jsoup connect login url method Connection Method GET ex
  • Grafana 世界地图:表数据源

    我正在尝试使用 grafana 的世界地图插件 以表数据作为数据源 在我的例子中为 influxdb 该插件得到了最新版本的支持 link 但遗憾的是我无法让它发挥作用 我使用与插件文档中相同的查询 但我的世界地图中没有显示任何点 以下是我
  • 如何将 Qline 坐标发送到 QPainter 小部件

    我创建了一个 Qwidget Form temp 它根据父窗口小部件 MainWindow 中创建的数据数组绘制线条 我面临的问题是我通过槽 send data 从 MainWindow 发送到 Form temp 的数据不被 Form t