gpt4 book ai didi

c++ - 缩放 QTableWidget

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:18 25 4
gpt4 key购买 nike

我需要缩放 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);
}

只有边框被重新缩放:

A scaled QTableWidget

而且我在 QTableWidgetItem 上没有看到任何 paintEvent,那么我该如何重新缩放我的所有表格?

提前谢谢你,祝你有美好的一天。

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

这个行为可能看起来很奇怪,所以这里有一些解释:

此 QT 窗口是 acrobat 阅读器窗口的子窗口。当我在 Acrobat 上取消缩放 PDF 时,我调整了 QT 窗口的大小以保持相同的比例,但我想缩放窗口的内容。

示例:如果我取消缩放 PDF,我会减小 QT 窗口的大小以保持相同的比例,并且我想将 QT 窗口的内容缩放到这个新大小(减小显示大小,就像取消缩放一样) .清楚吗 ? :o

但是例如 View 不适合窗口,我有这个:

result

我想要这个:

wanted result

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

wanted result after a zoom

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

最佳答案

QGraphicsScene 与您的 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);

缩放 View :

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

更好的缩放方式是通过滚轮放大。子类 View 或使用 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

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
}

用法:

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

结果如你所愿:

enter image description here

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

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

(相同的 MyQGraphicsView 类)

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

结果:

enter image description here

如您所见,用户可以缩放表、编辑数据以及信号和槽工作。一切都很好。

关于c++ - 缩放 QTableWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26885091/

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