简体   繁体   中英

Scale a QTableWidget

I need to scale a QtableWidget (the behaviour should be like a zoom).

But when I reimplement the paintEvent of QtableWidget and set the scale manually, like this:

void MyTableWidget::paintEvent ( QPaintEvent * event )
{
    QTableWidget::paintEvent(event);
    QPainter p(viewport());
    p.scale(m_scale,m_scale);
    p.drawRect( 0, 0, width()-1, height()-1);
}

only the border is rescaled :

缩放的QTableWidget

And I don't see any paintEvent on QTableWidgetItem, so how can I rescale all my table ?

Thank you in advance and have a good day.

EDIT ----------------------------------------

The behaviour may seems strange so here is some explanations:

This QT window is a child of an acrobat reader window. When I unzoom the PDF on acrobat, I resize my QT window to keep the same proportions, but I would like to scale the content of the window.

example: If I unzoom my PDF, I decrease the size of my QT window to keep the same proportions, and I want to scale the content of my QT window to this new size (decrease the display size, like an unzoom). Is it clear ? :o

But for instance the view donesn't fit the window, I have this:

结果

And I want this:

想要的结果

And when I zoom on my PDF, I increase the window size and scale up the content, like this:

缩放后想要的结果

Thank you very much for your help and your time.

Use QGraphicsScene with your QTableWidget instead, but it is not very difficult:

QGraphicsScene *scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);

QTableWidget *wgt = new QTableWidget;
wgt->setColumnCount(10);
wgt->setRowCount(10);
for (int ridx = 0 ; ridx < wgt->rowCount() ; ridx++ )
{
    for (int cidx = 0 ; cidx < wgt->columnCount() ; cidx++)
    {
        QTableWidgetItem* item = new QTableWidgetItem();
        item->setText(QString("%1").arg(ridx));
        wgt->setItem(ridx,cidx,item);
    }
 }
QGraphicsProxyWidget *pr = scene->addWidget( wgt );
pr->moveBy(10,10);

Scale view with:

ui->graphicsView->scale(2,2);

Better way for zooming is zoom in out by wheel. Subclass view or use eventFilter. For example:

Header:

#ifndef MYQGRAPHICSVIEW_H
#define MYQGRAPHICSVIEW_H

 #include <QGraphicsView>

class MyQGraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit MyQGraphicsView(QWidget *parent = 0);

signals:
protected:
    void wheelEvent(QWheelEvent* event);

};

#endif // MYQGRAPHICSVIEW_H

Cpp:

#include "myqgraphicsview.h"

#include <QPointF>

MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
    QGraphicsView(parent)
{
}

void MyQGraphicsView::wheelEvent(QWheelEvent* event) {

    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);

    // Scale the view / do the zoom
    double scaleFactor = 1.15;
    if(event->delta() > 0) {
        // Zoom in
        scale(scaleFactor, scaleFactor);
    } else {
        // Zooming out
        scale(1.0 / scaleFactor, 1.0 / scaleFactor);
    }

    // Don't call superclass handler here
    // as wheel is normally used for moving scrollbars
}

Usage:

MyQGraphicsView *view = new MyQGraphicsView;
view->setScene(scene);//same scene
view->show();

Result as you want:

在此处输入图片说明

Note that user still able to edit data etc, functionality didn't change.

Additional example, like in the Qt books.

(same MyQGraphicsView class)

#include "myqgraphicsview.h"
#include <QGraphicsProxyWidget>//and other needed includes

//just to show that signals and slots works
//with widget which placed in graphicsview
void print(int row, int column)
{
    qDebug() << row+1 << column+1;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *widget = new QWidget;//container
    QVBoxLayout *lay = new QVBoxLayout;
    MyQGraphicsView * view = new MyQGraphicsView;//view as part of UI
    QGraphicsScene * scene = new QGraphicsScene;
    QTableWidget *wgt = new QTableWidget;//table which will be added to graphicsView
    QObject::connect(wgt,&QTableWidget::cellPressed,print);//connection using Qt5 style(and power)
    wgt->setColumnCount(10);
    wgt->setRowCount(10);
    for (int ridx = 0 ; ridx < wgt->rowCount() ; ridx++ )
    {
        for (int cidx = 0 ; cidx < wgt->columnCount() ; cidx++)
        {
            QTableWidgetItem* item = new QTableWidgetItem();
            item->setText(QString("%1").arg(ridx));
            wgt->setItem(ridx,cidx,item);
        }
    }
    QPushButton *butt = new QPushButton("click");
    lay->addWidget(view);
    lay->addWidget(butt);
    widget->setLayout(lay);

    QGraphicsProxyWidget *pr = scene->addWidget( wgt );
    pr->moveBy(10,10);

    view->setScene(scene);
    widget->show();

    return a.exec();
}

Result:

在此处输入图片说明

As you can see, user can scale table, edit data and signals and slots works. All fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM