评估此处发布的代码非常困难。
看来您创建了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);
}