2014-11-12 2 views
1

Мне нужно масштабировать QtableWidget (поведение должно быть похоже на увеличение).Масштабировать QTableWidget

Но когда я переопределите paintEvent из QTableWidget и установить масштаб вручную, например:

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

И я не вижу paintEvent на QTableWidgetItem, так как я могу перемасштабировать всю таблицу?

Благодарим вас заблаговременно и у вас хороший день.

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

поведение может показаться странным, поэтому вот некоторые объяснения:

Это окно QT является дочерним элементом окна чтения акробата. Когда я разворачиваю PDF в acrobat, я изменяю размер окна QT, чтобы сохранить одинаковые пропорции, но я хотел бы масштабировать содержимое окна.

пример: если я разблокирую свой PDF, я уменьшу размер окна QT, чтобы сохранить одинаковые пропорции, и я хочу масштабировать содержимое моего окна QT до этого нового размера (уменьшите размер дисплея, например, unzoom). Так понятно ? : О

Но, например, вид donesn't размеру окна, у меня есть это:

result

И я хочу это:

wanted result

И когда я просигналить на мой PDF, я увеличиваю размер окна и увеличиваю содержание, например:

wanted result after a zoom

Благодарим вас за помощь и ваше время.

+0

что только граница перемасштабирована, потому что художник-obj, используемый в QTableWidget :: paintEvent, не тот, который вы масштабировали ... Я думаю, что ваша цель не так проста вообще. Либо «переписать» весь paintEvent QTableWidget, либо использовать QTableWidget в QGraphicsScene, где и нужно много работы, чтобы сделать – Robert

ответ

1

Используйте 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); 

вид Масштаб с:

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

Лучший способ для масштабирования является увеличение в путем колеса. Подкласс просмотреть или использовать 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

Как вы можете видеть, пользователь может масштабировать таблицы, редактировать данные и сигналы и слоты работает. Все в порядке.

+0

Спасибо @Chernobyl за вашу помощь! Моя архитектура была: QWidget с макетом, и этот макет содержал мой QTableWidget. Какую новую архитектуру мне нужно сделать? Мне нужно заменить QWidget на QGraphicsView, который содержит макет, содержащий QTableWidget? – Slot

+1

@Akiat QGraphicsView - сцена внутри - QTableWidget без макета (как и в моем ответе) или QGraphicsView - сцена внутри - QWidget с макетом и QTableWidget в этом макете. – Chernobyl

+0

Мне очень жаль, но вы можете уточнить? Я не понимаю, как вы рисуете виджеты? – Slot