首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5.2调用QTableWidget::update不会导致QTableWidget::does

Qt5.2调用QTableWidget::update不会导致QTableWidget::does
EN

Stack Overflow用户
提问于 2014-04-10 18:30:28
回答 1查看 1.7K关注 0票数 1

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

简介:- QTableWidgetEx --一个从QTableWidget派生的类,paintEvent overriden。-一些创建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,因此函数会被成功地覆盖,有时会被调用,但不会使用update或重新绘制。

(小测试应用程序-下面。测试项目作为一个空的Qt项目,由向导创建(Qt5.2:id=57865294773039719910 -完整源代码)。

我测试了“重新绘制”而不是“更新”--它给出了相同的结果。

问:文档中说QTableWidget::update应该触发QTableWidget::am,但是它没有让我做错什么?

我也进行了测试,并得到了相同的结果(不起作用):

  • 更新(Rect)
  • 重新油漆,重新油漆(重新油漆)
  • updateGeometry()
  • W->调整大小(w->宽度(),w->高度());

好的解决办法是:

代码语言:javascript
复制
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跟踪器

全部资料来源:

代码语言:javascript
复制
#--------------------------------------------------
# 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();
    };   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 07:56:25

QTableWidget是从QAbstractScrollArea派生的,并使用一个viewport小部件。如果调用viewport小部件的update()方法,将触发paintEvent:

代码语言:javascript
复制
void MainWindow::on_call_update()
{
    table_widget_ex->viewport()->update();
}

更多信息请访问:update()或fails ()未能触发paintEvent()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22996185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档