gpt4 book ai didi

c++ - Qt 5.2 调用 QTableWidget::update 不会导致 QTableWidget::paintEvent

转载 作者:行者123 更新时间:2023-11-30 04:06:11 26 4
gpt4 key购买 nike

我有一个问题:调用 QTableWidget::update 不会导致 QTableWidget::paintEvent。

简要说明:- QTableWidgetEx - 派生自 QTableWidget 的类,覆盖了 paintEvent。- 一些代码创建 QTableWidgetEx 和两个菜单项“call_update”和“check_paint_cnt”

测试顺序

  • 点击“check_paint_cnt”——状态栏显示“paint_cnt = 1”(所以paintEvent 调用)
  • 点击“call_update”
  • 再次点击“check_paint_cnt”——状态栏显示“paint_cnt = 1”,但是应该是 2...(不会调用 paintEvent)
  • 调整窗口大小确实会增加 paint_cnt,因此该函数被成功覆盖并有时被调用,但不会更新或重绘。

(小型测试应用程序 - 下面。作为空 Qt 项目的测试项目,由向导 (Qt 5.2) 创建:http://s000.tinyupload.com/index.php?file_id=57865294773039719910 - 完整的源代码。)

我测试了“重绘”而不是“更新”——结果相同。

问题: 文档说 QTableWidget::update 应该触发 QTableWidget::paintEvent,但它不会 我做错了什么?

我也测试过,结果相同(不工作):

  • 更新(矩形)
  • 重绘,重绘(矩形)
  • 更新几何()
  • w->resize(w->width(), w->height());

好的解决方法是:

inline void wa_widget_update(QWidget* w)
{
if(auto a = dynamic_cast<QAbstractScrollArea*>(w))
a->viewport()->update();
else
w->update();
};

使用 wa_widget_update(w) 代替 w->update()。有点丑但有效。将此错误报告给 qt 项目: Link to bugtracker

完整来源:

#--------------------------------------------------
# Qt_Update_Test.pro contents
#--------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Qt_Update_Test
TEMPLATE = app
SOURCES += main.cpp
HEADERS += main.h

//--------------------------------------------------
// main.h contents
//--------------------------------------------------

#ifndef MAIN_H
#define MAIN_H

#include <QApplication>
#include <QMainWindow>
#include <QTableWidget>
#include <QPaintEvent>
#include <QStatusBar>
#include <QMenuBar>

extern int paints_cnt; // Global variable - paintEvent calls counter

class QTableWidgetEx : public QTableWidget
{
Q_OBJECT
public:
inline explicit QTableWidgetEx(QWidget *parent = 0) : QTableWidget(parent) {};
protected:
virtual void paintEvent(QPaintEvent* e) override;
};


class MainWindow : public QMainWindow
{
Q_OBJECT
public:
QTableWidgetEx* table_widget_ex;
QMenuBar* menuBar;
QStatusBar* statusBar;

explicit MainWindow(QWidget *parent = 0);
inline ~MainWindow(){};
protected slots:
void on_call_update();
void on_check_paint_cnt();
};

#endif

//--------------------------------------------------
// main.cpp contents
//--------------------------------------------------

#include "main.h"
int paints_cnt = 0; // Global variable - paintEvent calls counter

void QTableWidgetEx::paintEvent(QPaintEvent* e)
{
++paints_cnt;
QTableWidget::paintEvent(e);
}

void MainWindow::on_call_update()
{
table_widget_ex->update();
};

void MainWindow::on_check_paint_cnt()
{
statusBar->showMessage("paints_cnt = " + QString::number(paints_cnt));
};

// Below - Layout code, signal-slots, entry point, etc...
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
resize(400, 300);

menuBar = new QMenuBar(this);
setMenuBar(menuBar);

table_widget_ex = new QTableWidgetEx(this);
table_widget_ex->setUpdatesEnabled(true);
setCentralWidget(table_widget_ex);

statusBar = new QStatusBar(this);
setStatusBar(statusBar);

auto call_update = new QAction("call_update", this);
connect(call_update, SIGNAL(triggered()), this, SLOT(on_call_update()));
menuBar->addAction(call_update);

auto check_paint_cnt = new QAction("check_paint_cnt", this);
connect(check_paint_cnt, SIGNAL(triggered()), this, SLOT(on_check_paint_cnt()));
menuBar->addAction(check_paint_cnt);
};

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

最佳答案

QTableWidget 派生自 QAbstractScrollArea 并使用视口(viewport)小部件。如果调用视口(viewport)小部件的 update() 方法,将触发 paintEvent:

void MainWindow::on_call_update()
{
table_widget_ex->viewport()->update();
}

更多信息请访问:update() or repaint() fails to trigger paintEvent()

关于c++ - Qt 5.2 调用 QTableWidget::update 不会导致 QTableWidget::paintEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com