- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个 Qwidget,Form_temp,它根据在父窗口小部件 MainWindow 中创建的数据数组绘制线条。我面临的问题是我通过插槽 send_data 从 MainWindow 发送到 Form_temp 的数据没有被 Form_temp 中的其他函数看到。 (绘画事件)。
我无法找出漏洞。我添加了几个调试点来验证数据是否到达 Form_temp。
这是带有一些解释的代码。我用 QTCreator 做了这个请帮忙,我花了几天时间,无法继续前进。
另一个问题:每次用户移动鼠标或另一个小部件正在更新其 View (例如,我有一个显示时间的标签)时,都会发生 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);
}
[...]
感谢阅读。塞巴斯蒂安。
最佳答案
很难评估此处发布的代码。
看起来您使用 Qt Designer 创建了 QWidget
子类 Form_temp
,这意味着它有一些实际上并不需要的额外设计时包袱。
当您创建 Form_temp
的实例时,您没有将 MainWindow
设置为构造函数中的父级,因此我不太确定您的自定义小部件将如何绘制本身,因为它从未收到对 show()
本身的调用。它也从未被破坏。
使用插槽和实现所需的布线也不存在,因此无法确定在这种情况下这是否是一个问题区域。
不过,您应该有可能实现自己的目标 :) 我强烈建议您查看 Qt Analog Clock Example因为这很好地演示了如何实现您自己的小部件。
您提到您只希望小部件在更改数据时自行更新,但您误解了 Qt 框架的运行方式。您希望小部件在更改数据时自行绘制,但这不是小部件需要自行绘制的唯一时间,因此您不应尝试以这种方式限制绘制操作。
将代码放入 paintEvent()
中,它将根据当前数据按照您希望的方式绘制整个小部件。该框架将在小部件首次出现时执行 paintEvent()
,当它在先前被另一个窗口遮挡后显示时以及您无法控制的许多其他情况下显示。
添加允许您从类外部更改基础数据的普通方法(不需要插槽),并确保这些方法在它们的末尾包含对 update()
的调用,以便它们将向框架发出信号,表明应该重新绘制小部件。
如果您的小部件复杂且绘制缓慢,您可以查看传递给 paintEvent()
的事件中指定的区域,以将您的绘制代码限制在需要更新的区域。
更新:
您的代码很接近。我已将其精简到最基本的内容以演示基础知识。您应该能够根据自己的需要对其进行详细说明。
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);
}
Form_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 */
Form_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);
}
关于c++ - 如何将 Qline 坐标发送到 QPainter Widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6159830/
我有一个点(粉色圆圈),它有一个已知的 X 坐标和一个已知的 Y 坐标,但 Y 坐标> 坐标不正确。它当前位于目标贝塞尔曲线(部分位于白色正方形中的曲线)所在的点(如果它是两点之间的一条线)。我需要为
有一个基于QML 和QWT 的代码,一种具有更多可能性的图形生成器。技术要求之一是根据某个 X 坐标获得绘图曲线的 Y 坐标。 有一种不准确的方法 - 获取 QwtPlotCurve 的 QPoint
我目前正在将对象的 3D 坐标转换为 2D 坐标,然后在其上绘制 2D 文本(目前是对象名称): public static int[] getScreenCoords(double x, doubl
首先,我创建一个元组列表(要绘制的点)。每个元组由 3 个数字组成(x - 坐标,y - 坐标,c - 点的颜色) import random import matplotlib.pyplot as
我正在制作一个 2 人 Java 游戏,但我需要确保坐标保留在板上。 addPiece(1, 1, "X"); addPiece(8, 8, "O"); showBoard(); Scanner my
我想检查我是否正确使用了 scipy 的 KD 树,因为它看起来比简单的暴力破解要慢。 关于这个我有三个问题: Q1. 如果我创建以下测试数据: nplen = 1000000 # WGS84 lat
我有一个 GeoJSON 文件,我正在尝试处理它以便在谷歌地图上绘制一些功能。然而,问题在于坐标不是传统的纬度/经度表示法,而是一些大的六位/七位数字。示例: { "type":
我在使用坐标时遇到格式化问题。 public class Coordinate { public int x; public int y; public Coordinate( int x
我正在尝试获取当前位置的经度和纬度坐标。这是到目前为止我的代码: public class MainActivity extends AppCompatActivity { @Override pro
基本上,我需要获取从 OpenGL 中的贝塞尔曲线实现绘制的所有坐标。具体来说,我需要坐标来沿着弯曲的轨迹路径移动场景中的球体对象(棒球)。这是我用来绘制曲线的: GL2 gl = drawable.
现在我用 JAVA 遇到了一些问题,但不记得如何获取坐标系之间的长度。 例如。A 点 (3,7)B点(7,59) 我想知道如何计算a点和b点之间的距离。非常感谢您的回答。 :-) 最佳答案 A = (
我正在用 Pi2Go 机器人制作一个小项目,它将从超声波传感器获取数据,然后如果它看到一个物体,则放置一个 X,并放置 O 它当前所在的位置,我有两个问题:如何在 tkinter 上设置坐标位置?例如
如何在 pygame 中存储对象的先前坐标?我的问题可能有点难以解释,但我会尽力,如果您自己尝试我的代码以理解我的意思可能会有所帮助。 这就是我的游戏的内容。我希望这能让我的问题更容易理解。 我正在创
如何存储用户的当前位置并在 map 上显示该位置? 我能够在 map 上显示预定义的坐标,只是不知道如何从设备接收信息。 此外,我知道我必须将一些项目添加到 Plist 中。我怎样才能做到这一点? 最
我在 android 应用程序开发方面不是很熟练,我正在开发一个测试应用程序。我检测到了脸和眼睛,现在我要根据眼睛的坐标在脸上画一些像粉刺或疤痕的东西(例如脸颊上的眼睛下方)。稍后,我会把眼镜或帽子放
所以我正在使用 API 来检测图像中的人脸,到目前为止它对我来说效果很好。然而,我一直无法弄清楚如何将图像裁剪到脸上。我知道如何裁剪位图,但它需要获取位图中脸部的左上角位置以及宽度和高度。当我使用 查
我有 2 个表。第一个表包含以下列:Start_latitude、start_longitude、end_latitude、end_longitude、sum。 sum 列为空,需要根据第二张表进行填
有没有办法给 Google Maps API 或类似的 API 一个城镇名称,并让它返回城镇内的随机地址?我希望能够将数据作为 JSON 获取,以便我可以在 XCode 中使用 SwiftyJSON
我将坐标保存在 numpy 数组 x 和 y 中。现在我想要的只是获得一个多边形(分别是点数组),它用给定的宽度参数定义周围区域。 我遇到的问题是我需要一个没有(!)交叉点的多边形。但是,当曲线很窄时
我正在开发井字游戏 (3x3),所以我有 9 个按钮,我想做的是获取用户按下的按钮的坐标,并在按钮的位置插入图像。 例子: @IBOutlet weak var button1Outlet: UIBu
我是一名优秀的程序员,十分优秀!