C++ 缩放QTableWidget

C++ 缩放QTableWidget,c++,qt,scale,qtablewidget,C++,Qt,Scale,Qtablewidget,我需要缩放QtableWidget(其行为应该类似于缩放) 但是当我重新实现QtableWidget的paintEvent并手动设置比例时,如下所示: void MyTableWidget::paintEvent ( QPaintEvent * event ) { QTableWidget::paintEvent(event); QPainter p(viewport()); p.scale(m_scale,m_scale); p.drawRect( 0, 0,

我需要缩放QtableWidget(其行为应该类似于缩放)

但是当我重新实现QtableWidget的paintEvent并手动设置比例时,如下所示:

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);
}
仅重新缩放边界:

我在QTableWidgetItem上没有看到任何paintEvent,因此如何重新缩放所有表

提前谢谢你,祝你过得愉快

编辑----------------------------------------

这种行为可能看起来很奇怪,以下是一些解释:

此QT窗口是acrobat reader窗口的子窗口。在acrobat上取消缩放PDF时,我会调整QT窗口的大小以保持相同的比例,但我希望缩放窗口的内容

示例:如果我取消缩放PDF,我将减小QT窗口的大小以保持相同的比例,并且我希望将QT窗口的内容缩放到此新大小(减小显示大小,如取消缩放)。清楚吗o

但是,例如,视图不适合窗口,我有:

我想要这个:

当我放大PDF时,我会增大窗口大小并放大内容,如下所示:

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);
}


非常感谢您的帮助和时间。

请将
qgraphicscene
与您的
QTableWidget
一起使用,但这并不难:

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);
更好的变焦方法是通过轮子放大缩小。子类查看或使用eventFilter。例如:

标题:

#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
结果如下所示:

请注意,用户仍然能够编辑数据等,功能没有改变

其他示例,如Qt书籍中的示例

(相同的
MyQGraphicsView
class)

#包括“myqgraphicsview.h”
#include//和其他需要的include
//只是为了证明信号和插槽是有效的
//使用放置在graphicsview中的小部件
无效打印(整数行,整数列)
{
qDebug()setRowCount(10);
对于(int-ridx=0;ridxrowCount();ridx++)
{
对于(int-cidx=0;cidxcolumnCount();cidx++)
{
QTableWidgetItem*item=新的QTableWidgetItem();
item->setText(QString(“%1”).arg(ridx));
wgt->setItem(ridx、cidx、item);
}
}
QPushButton*butt=新的QPushButton(“点击”);
lay->addWidget(视图);
铺设->添加小部件(对接);
小部件->设置布局(布局);
QGraphicsProxyWidget*pr=场景->添加Widget(wgt);
pr->moveBy(10,10);
查看->设置场景(场景);
widget->show();
返回a.exec();
}
结果:


正如你们所看到的,用户可以缩放表格,编辑数据和信号,插槽工作。很好。

仅重新缩放边框是因为QTableWidget::paintEvent中使用的painter obj不是您缩放的对象。。。我认为你的目标一点也不简单。要么“重写”QTableWidget的整个paintEvent,要么在qgraphicscene中使用QTableWidget,两者都需要大量工作才能感谢您@Chernobyl的帮助!我的架构是:一个带有布局的QWidget,这个布局包含我的QTableWidget。我需要做的新架构是什么?我需要用包含QTableWidget的布局的QGraphicsView替换我的QWidget?@Akiat QGraphicsView-场景内部视图-没有布局的QTableWidget(正如我在回答中所做的那样),或者QGraphicsView-场景内部视图-QWidget在这个布局中包含布局和QTableWidget。很抱歉,您能更具体一点吗?我不明白你是怎么把这些小部件叠起来的?@Akiat好的,你真的需要布局吗?你可以只使用QGraphicsView和QTableWidget以及所有其他Buton标签,等等,贴在QGraphicsView附近吗?@Akiat不幸的是,我不明白你的代码,你为什么要使用winapi、graphicsview中的布局和其他东西。我不能在这里做什么。但我又写了一个例子,比如在Qt书中(如果你复制粘贴它,它会起作用(不要忘了包括需要的东西)。这个例子展示了主要思想,以及你如何使用布局以及你应该在哪里使用布局。我真的做不到或提出更好的建议。请看我更新的答案。
#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
}
MyQGraphicsView *view = new MyQGraphicsView;
view->setScene(scene);//same scene
view->show();
#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();
}