Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt 5.2调用QTableWidget::update不会导致QTableWidget::paintEvent_C++_Qt_Qtablewidget_Paintevent - Fatal编程技术网

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

C++ Qt 5.2调用QTableWidget::update不会导致QTableWidget::paintEvent,c++,qt,qtablewidget,paintevent,C++,Qt,Qtablewidget,Paintevent,我有一个问题:调用QTableWidget::update不会导致QTableWidget::paintEvent 简要说明: -QTableWidgetEx-从QTableWidget派生的类,覆盖了paintEvent。 -创建QTableWidgetEx的一些代码和两个菜单项“call\u update”和“check\u paint\u cnt” 测试顺序 单击“检查绘制”-状态栏显示“绘制=1”(so paintEvent已调用) 单击“呼叫更新” 再次单击“检查绘制”-状态栏显示“

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

简要说明: -QTableWidgetEx-从QTableWidget派生的类,覆盖了paintEvent。 -创建QTableWidgetEx的一些代码和两个菜单项“call\u update”和“check\u paint\u cnt”

测试顺序

  • 单击“检查绘制”-状态栏显示“绘制=1”(so paintEvent已调用)
  • 单击“呼叫更新”
  • 再次单击“检查绘制”-状态栏显示“绘制=1”,但 应该是2。。。(不需要调用paintEvent)
  • 调整窗口大小确实会增加绘制,因此该函数会被成功重写,有时会被调用,但不会使用更新或重新绘制
(小测试应用程序-如下。 测试项目作为一个空的Qt项目,由向导(Qt5.2)创建:-完整的源代码。)

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

问题: 文档中说QTableWidget::update应该触发QTableWidget::paintEvent,但事实并非如此 我做错了什么

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

  • 更新(rect)
  • 重新绘制,重新绘制(rect)
  • 更新计量学()
  • 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();
    };
inline void wa_widget_更新(QWidget*w)
{
if(自动a=动态(w))
a->viewport()->update();
其他的
w->update();
};
使用wa_widget_update(w)代替w->update()。有点难看,但很管用。 向qt项目报告了此错误:

全部资料来源:

#--------------------------------------------------
# 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();
    };   
#--------------------------------------------------
#Qt_Update_Test.pro内容
#--------------------------------------------------
QT+=核心gui
greaterThan(QT\u主要版本,4):QT+=widgets
目标=Qt\u更新\u测试
模板=应用程序
SOURCES+=main.cpp
标题+=main.h
//--------------------------------------------------
//主要内容
//--------------------------------------------------
#ifndef MAIN_H
#定义主
#包括
#包括
#包括
#包括
#包括
#包括
外部内部涂料_cnt;//全局变量-paintEvent调用计数器
类QTableWidgetEx:publicqtablewidget
{
Q_对象
公众:
内联显式QTableWidgetEx(QWidget*parent=0):QTableWidget(parent){};
受保护的:
虚拟void paintEvent(QPaintEvent*e)覆盖;
};
类主窗口:公共QMainWindow
{
Q_对象
公众:
QTableWidgetEx*表_小部件_ex;
QMenuBar*菜单栏;
QStatusBar*状态栏;
显式主窗口(QWidget*parent=0);
inline~MainWindow(){};
受保护插槽:
调用更新()时无效;
检查油漆时无效();
};
#恩迪夫
//--------------------------------------------------
//main.cpp内容
//--------------------------------------------------
#包括“main.h”
int paints_cnt=0;//全局变量-paintEvent调用计数器
void QTableWidgetEx::paintEvent(QPaintEvent*e)
{
++涂料;
QTableWidget::paintEvent(e);
}
void main window::on_call_update()
{
表_widget_ex->update();
};
void main window::on_check_paint_cnt()
{
状态栏->显示消息(“Paint_cnt=“+QString::number(Paint_cnt));
};
//以下-布局代码、信号槽、入口点等。。。
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)
{
调整大小(400300);
菜单栏=新的QMenuBar(该菜单栏);
设置菜单栏(菜单栏);
table_widget_ex=新的QTableWidgetEx(此);
表\u widget\u ex->setUpdatesEnabled(true);
setCentralWidget(表\u小部件\u ex);
statusBar=新的QStatusBar(此);
设置状态栏(状态栏);
自动调用更新=新的QAction(“调用更新”,this);
连接(调用更新,信号(触发()),此,插槽(在调用更新()上);
菜单栏->添加操作(调用更新);
自动检查油漆=新的QAction(“检查油漆”,本);
连接(检查油漆,信号(已触发()),此,插槽(检查油漆());
菜单栏->添加操作(检查油漆);
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
};   

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

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

更多信息请参见:

QWidget::setUpdatesEnabled()默认为true,不是吗?请确保您已在小部件上调用show(),并且您位于QApplication::exec()事件循环中。如果您点击check_paint_cnt()操作,您可能会遇到所有这些问题。这里或其他地方可能会出现复制粘贴错误。确保在C++11编译器下编译它,在.pro文件中添加
CONFIG+=C++11
,并将事件处理程序声明为
void paintEvent(QPaintEvent*)覆盖。确保它仍然可以编译-如果它不能编译,那么您就不会重写您认为是的函数:)此外,您要做的是什么?为什么要重写这样一个非常复杂的类的绘画事件呢?-小部件是可见的-我可以在屏幕上看到它。关于它的部分是从
QAbstractScrollArea
派生的,解决了我的问题。我以这种方式实例化
QPainter painter(viewport()),取自。谢谢Steffen!