QT如何去掉自动擦除

mavisjhsw 2018-06-11 04:19:54
QT在paintEvent之前都会先自动擦除,那我不想擦除怎么办呢?(我代码里没有调用repaint/update之类的函数,是qt自动刷新的)
看文档我用了下面这些参数,但都编译不过:
Qt::WRepaintNoErase、Qt::WNoAutoErase
main.cpp:64:28: error: 'WNoAutoErase' is not a member of 'Qt'

QT版本4.8

其实我的问题是,一个界面里n个widget,其实只有一个widget在更新(比如只有一行滚动字串),但是发现这个界面上所有的widget都调用了paintEvent,也就是所有widget都更新了,这样CPU占有率就很高,滚动效果就非常差。我找不到为什么会全部更新而不是只更新某个变化的控件的原因(因为我从没有调过repaint/update之类的函数),所以我的解决办法就是在paintEvent里面判断有无内容更新,没有就直接返回,但是在我调用paintEvent之前,内容已经被擦除了!
...全文
2238 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
揽月凡尘 2018-06-16
  • 打赏
  • 举报
回复
可以将绘制的内容绘制到QIMAGE上面并作为成员变量,如果没有改变就直接绘制那张图片就可以,这个很快的,就1ms的事情
mavisjhsw 2018-06-13
  • 打赏
  • 举报
回复
我现在就是想让qt不要自动擦除,不知有办法否
mavisjhsw 2018-06-13
  • 打赏
  • 举报
回复
引用 2 楼 YIZI_LinRL 的回复:
直接在要更新widget里重写paintEvent,在需要刷新的时候再来触发widget的重绘事件
我现在是这样做,但是进入paintEvent要重写的区域已经被擦掉了,即使没有任何变化
_LinGM 2018-06-12
  • 打赏
  • 举报
回复
直接在要更新widget里重写paintEvent,在需要刷新的时候再来触发widget的重绘事件
mavisjhsw 2018-06-11
  • 打赏
  • 举报
回复
main.cpp:
QApplication a(argc, argv);
    QGraphicsView view();
    view.setWindowFlags(Qt::FramelessWindowHint);
    view.setCacheMode(QGraphicsView::CacheBackground);
    view.resize(320, 240);
    OpenGLScene scene(320, 240);
    view.setScene(&scene);
    view.setStyleSheet("padding:0px;border:0px");
    view.show();
    return a.exec();
mainwindow.h:
class MainWindow :
		public QWidget
{
	Q_OBJECT
	class Ui_MainWindow
	{
	public:
		void setupUi(QWidget *mainWindow)
		{
			QSize	screenSize(320, 240);
			QPalette	p;
			p.setColor(QPalette::Background, QColor(Qt::black));

			if (mainWindow->objectName().isEmpty())
				mainWindow->setObjectName(QString::fromUtf8("MainWindow"));
			mainWindow->resize(screenSize);
			mainWindow->setPalette(p);
                }
        };
public:
    explicit MainWindow(QWidget *parent = 0);
    virtual ~MainWindow();
};

class OpenGLScene : public QGraphicsScene
{
    Q_OBJECT
public:
    OpenGLScene(int width, int height)
    {
        setSceneRect(0, 0, width, height);
        MainWindow *w = new MainWindow(); //MainWindow上面的控件大部分都会自动刷新,即使没有任何变化
        QGraphicsProxyWidget *pProxy = addWidget(w);
        w->showFullScreen();
        pProxy->show();
    }
};

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧