[Qt-jambi-interest] Widget Size 0? How to show large pixmpa in a small viewport without loosing pixmap data
Dawid Sip
vad at poczta.onet.pl
Thu Apr 17 16:22:01 CEST 2008
Hi,
the solution with the overriden resizeEvent of the GraphicsView was a
nice learning example but unfortunately it is not exactly what I'am
looking for. I want the scene (or Pixmap) to fit into the GraphicsView
but I dont want to rescale it and loose data. Thus, what I need is to
somehow rescale the scene in which the pixmap resolution stays untougched.
For example, I work with large images (~2500x2000) and I want to show
them in graphicsView which is ~400x300, scaled so the image fits into
that 300x400 view and the image resolution stays 2500x2000(inside pixmap
item) and when I click in the middle of that GraphicsView -pos(150,200)
I can transform this down to the item and get somethink like
pos(1250x1000). So I somehow need to adjust the projection. I think this
is an issue of the viewport. I think I could achieve this by changing
the viewport to QGLWidget and with help of some wrapper lib. like JOGL
adjust the viewport/frustum, but I'd rather not use OpenGL in my
application. So is this the only way or can I still do this with the
default QWidget as viewport?
Sow the question is: "How to show large pixmpa in a small viewport
without loosing pixmap data"
Could somebody please point me in the right direction?
Dawid
> Dawid Sip wrote:
>> I understand that the resizeEvent is propageted like this:
>> MainWindow
>> ->Splitter
>> -->dockWidget
>> --->GraphicsView
>> ---->GraphicsScene
>> ----->Image
>>
>> So my guess is that I have to reimplement resizeEvent of the
>> GraphicsScene, where i can get the size of the parent - GraphicsView
>> and with this size i can set the size of the Image?
>>
>
> The size of graphics scene is not really related as the view can view
> any part of the scene you want. The layout system will make sure that
> the size of the view is connected to the size of the dock widget
> (which again is controlled by the splitter), so you would only need to
> listen to the resize event of the view and your application will work
> regardless of how the widget hierarchy looks. I've modified your
> example a little to show you how this might be done. Please note that
> this is probably not your most highly optimized example (you might
> want to turn off opaque resizing for the splitters to avoid big
> garbage collection steps and to increase the performance), but it
> shows you the idea. (Also, this won't work if you add any transform to
> the graphics view of course, in fact most of the things you can do
> with a graphics view will break it, but I wanted to recreate the
> hierarchy in your drawing above.)
>
> Just replace the hard coded path of the icon to something you have
> available.
>
> Hope this is what you were looking for!
>
> -- Eskil
>
>
> ------------------------------------------------------------------------
>
> import com.trolltech.qt.core.Qt.Orientation;
> import com.trolltech.qt.gui.*;
>
> class MyDockWidget extends QDockWidget {
>
> public MyDockWidget() {
>
> QGraphicsScene scene = new QGraphicsScene();
> final QPixmap pixmap = new QPixmap("classpath:com/trolltech/images/qt-logo.png");
> final QGraphicsPixmapItem item = scene.addPixmap(pixmap);
>
> QGraphicsView view = new QGraphicsView() {
>
> @Override
> protected void resizeEvent(QResizeEvent e) {
> item.setPixmap(pixmap.scaled(e.size()));
> super.resizeEvent(e);
> }
> };
> view.setScene(scene);
>
> setWidget(view);
> }
>
> }
>
> public class guiSplit extends QMainWindow{
>
> Ui_guiSplitClass ui = new Ui_guiSplitClass();
> QSplitter spliterV = new QSplitter(Orientation.Vertical);
> QSplitter spliterH = new QSplitter(Orientation.Horizontal);
> private int imageInCentralWidget = 0;
>
> public static void main(String[] args) {
> QApplication.initialize(args);
> guiSplit testguiSplit = new guiSplit();
> testguiSplit.show();
> QApplication.exec();
> }
>
> public guiSplit(){
> ui.setupUi(this);
>
> spliterV.addWidget(spliterH);
>
> QWidget w = new QWidget();
> QHBoxLayout layout = new QHBoxLayout(w);
> layout.addWidget(spliterV);
>
> setCentralWidget(w);
> }
>
> public guiSplit(QWidget parent){
> super(parent);
> ui.setupUi(this);
> }
>
> QDockWidget dockWid;
> public void on_actionAddDockWid_triggered() {
> if(imageInCentralWidget==3) return;
>
> System.err.println("\n\n\n");
> dockWid = new MyDockWidget();
> dockWid.setObjectName("dockWid"+(++imageInCentralWidget));
> dockWid.setFeatures(com.trolltech.qt.gui.QDockWidget.DockWidgetFeature.createQFlags(com.trolltech.qt.gui.QDockWidget.DockWidgetFeature.NoDockWidgetFeatures));
>
> QApplication.processEvents();
>
> switch(imageInCentralWidget){
> case 1:
> spliterH.addWidget(dockWid);
> break;
> case 2:
> spliterH.addWidget(dockWid);
> break;
> case 3:
> spliterV.addWidget(dockWid);
> break;
> }
> }
> }
>
More information about the Qt-jambi-interest
mailing list