Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [SOLVED]setting scroll bar
Forum Updated to NodeBB v4.3 + New Features

[SOLVED]setting scroll bar

Scheduled Pinned Locked Moved General and Desktop
14 Posts 4 Posters 7.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jk_mk
    wrote on last edited by
    #1

    Hi to all,

    I want to use a vertical scroll bar in a function. I want to set its range using two global variables [global1,global2].And I want to use its value, as a global variable (global3) each time is changed by an event. Could somebody help me to set this vertical scroll bar?

    Thanks in advance

    1 Reply Last reply
    0
    • EddyE Offline
      EddyE Offline
      Eddy
      wrote on last edited by
      #2

      have a look at :
      "examples > widgets > sliders ":http://doc.qt.nokia.com/4.7-snapshot/widgets-sliders.html

      I think this is what you want.

      Qt Certified Specialist
      www.edalsolutions.be

      1 Reply Last reply
      0
      • J Offline
        J Offline
        jk_mk
        wrote on last edited by
        #3

        Do you know which method is responsible for getting the value of a vertical scroll bar?

        1 Reply Last reply
        0
        • EddyE Offline
          EddyE Offline
          Eddy
          wrote on last edited by
          #4

          You can connect the signal
          void QAbstractSlider::valueChanged ( int value )
          to a slot where you use value

          In the examples they use the following to connect in 2 directions
          @ connect(slider, SIGNAL(valueChanged(int)), scrollBar, SLOT(setValue(int)));
          connect(scrollBar, SIGNAL(valueChanged(int)), dial, SLOT(setValue(int)));@

          Qt Certified Specialist
          www.edalsolutions.be

          1 Reply Last reply
          0
          • A Offline
            A Offline
            andre
            wrote on last edited by
            #5

            What is the reason that you want to use global variables? In general, that is not a good idea at all.

            1 Reply Last reply
            0
            • J Offline
              J Offline
              jk_mk
              wrote on last edited by
              #6

              As I can see in my program I may not need to use global variables.Well, I have created a button , when you press it you get and display in a QGraphicsView a 2D slice from a 3D volume. But I have set my own a fixed value from this slice (z=89).But my 3D volume has z with range [1,139].I want to display 2D slices of different z every time the value of the scroll bar is changed. Since so far I have managed to display my initial slice, but to display an other slice of z, I must press again the button and reload my 3D image. How could I solve this problem? Here I put some code:

              @QObject::connect(ui->verticalScrollBar_z, SIGNAL(valueChanged()), this, SLOT(push_button_File()));@

              and

              @void MainWindow::push_button_File()
              {

              QString fileName = QFileDialog::getOpenFileName(this,
              tr("Open File"), QDir::currentPath());

              ........... code of ITK to display 2D slices from 3D volume.......
              ..................................................................
              ////////this 2 lines are rensponsible for setting the slice number
              unsigned int sliceNumber = ui->verticalScrollBar_z->value();
              start[2] = sliceNumber;
              /////////////////

              static QGraphicsPixmapItem* pixmapItem;

              if (!pixmapItem) {
              // pixmapItem = scene->addPixmap(QPixmap("2D.png"));

              QPixmap tmpmap (QPixmap("2D.png"));
                  pixmapItem = scene->addPixmap ( tmpmap.scaled (214,256) );
              
                      ui->graphicsView_inputImage->setScene(scene);
                  } else {
              

              QPixmap tmpmap (QPixmap("2D.png"));
              pixmapItem->setPixmap(tmpmap.scaled ( 214,256));
              }

              return;
              

              }@

              1 Reply Last reply
              0
              • J Offline
                J Offline
                jk_mk
                wrote on last edited by
                #7

                In my mainwindow I have written the following, but when I put a break-point, when I change the value of scroll bar, I cannot get inside the function push_button_File. Had I to set the valueChanged() function somewhere? What I am doing wrong?
                I hope somebody could help me.

                @QObject::connect(ui->verticalScrollBar_z, SIGNAL(valueChanged()), this, SLOT(push_button_File()));@

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  jk_mk
                  wrote on last edited by
                  #8

                  Lets suppose that we have a slicer consists of 137 slices (z=[1 137]). To choose which slice I must display in my QGraphicsView, I call one method which loads a 3D volume and contains a parameter z. I also use, a vertical Scroll bar of range [1 137]. My question, is how could I change with the mouse the value of the scroll bar and insert this value into my method, in order to display all the slices from 1 to 137, just with the press of the scroll bar.

                  I hope somebody could help me this time.

                  1 Reply Last reply
                  0
                  • J Offline
                    J Offline
                    jk_mk
                    wrote on last edited by
                    #9

                    Well, to understand what you are saying. If I write this:
                    @ public slots:
                    void push_button_File(int x);@

                    @connect(ui->verticalScrollBar_z, SIGNAL(valueChanged(int x)), this, SLOT(push_button_File(int x)));@

                    @void MainWindow::push_button_File(int x)
                    {
                    unsigned int sliceNumber = x;
                    }@

                    Then, every time I change with my mouse the value of scrollbar, the function push_button_File runs , and the slicenumber gets the value x?

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      andre
                      wrote on last edited by
                      #10

                      Yes. You could have found that out by either:

                      • reading the documentation on how Signals & Slots works, or
                      • just try the code.
                      1 Reply Last reply
                      0
                      • J Offline
                        J Offline
                        jk_mk
                        wrote on last edited by
                        #11

                        Well, I am using ITK with Qt and still I have the same problem. Here is my code and I hope that someone could tell me what I am doing wrong. When I deckare the function_ void MainWindow::push_button_File(), like this, at least I get some results.
                        Thanks

                        @#include "mainwindow.h"
                        #include "ui_mainwindow.h"
                        #include "canvas.h"

                        #include "itkImage.h"
                        #include "itkImageFileReader.h"
                        #include "itkImageFileWriter.h"
                        #include "itkExtractImageFilter.h"
                        #include <itkSize.h>

                        QString fileName;

                        unsigned long size_x;
                        unsigned long size_y;
                        unsigned long size_z;

                        MainWindow::MainWindow(QWidget *parent) :
                        QMainWindow(parent),
                        ui(new Ui::MainWindow)
                        {
                        ui->setupUi(this);

                        ui->graphicsView_inputImage->setScene(scene=new Canvas());
                        
                        connect(scene,SIGNAL(mousejustpressed(int,int)),this,SLOT(mousejustpressed(int,int)));
                        

                        QObject::connect(ui->pushButton_openFile, SIGNAL(clicked()),
                        this, SLOT(push_button_File(int x)));

                        connect(ui->verticalScrollBar_z, SIGNAL(valueChanged(int x)),
                        this, SLOT(push_button_File(int x)));

                        }

                        void MainWindow::push_button_File(int x)
                        {

                        QString fileName = QFileDialog::getOpenFileName(this,
                        tr("Open File"), QDir::currentPath());

                        ///unsigned char to display in .png format
                        typedef unsigned char InputPixelType;
                        typedef unsigned char OutputPixelType;

                        typedef itk::Image< InputPixelType, 3 > InputImageType;
                        typedef itk::Image< OutputPixelType, 2 > OutputImageType;

                        typedef itk::ImageFileReader< InputImageType > ReaderType;
                        typedef itk::ImageFileWriter< OutputImageType > WriterType;

                        ReaderType::Pointer reader = ReaderType::New();
                        WriterType::Pointer writer = WriterType::New();

                        // reader->SetFileName("C:/Users/manolis/Desktop/data/test.png");
                        reader->SetFileName( fileName.toStdString() );
                        writer->SetFileName( "2D.png" );

                        typedef itk::ExtractImageFilter< InputImageType, OutputImageType > FilterType;
                        FilterType::Pointer filter = FilterType::New();

                        reader->Update();
                        

                        InputImageType::RegionType inputRegion =
                        reader->GetOutput()->GetLargestPossibleRegion();

                        InputImageType::SizeType size = inputRegion.GetSize();

                        // get the size of the hole 3D image
                        unsigned long size_x = size[0];
                        unsigned long size_y = size[1];
                        unsigned long size_z = size[2];

                        // get slices of z coordiante
                        size[2] = 0;

                        InputImageType::IndexType start = inputRegion.GetIndex();
                        ui->verticalScrollBar_z->setRange(1,size_z);
                        unsigned int sliceNumber = x; //ui->verticalScrollBar_z->value();
                        start[2] = sliceNumber;

                        InputImageType::RegionType desiredRegion;
                        desiredRegion.SetSize( size );
                        desiredRegion.SetIndex( start );

                        filter->SetExtractionRegion( desiredRegion );

                        filter->SetInput( reader->GetOutput() );
                        writer->SetInput( filter->GetOutput() );

                        try
                        {
                        writer->Update();
                        }
                        catch( itk::ExceptionObject & err )
                        {
                        std::cerr << "ExceptionObject caught !" << std::endl;
                        std::cerr << err << std::endl;
                        }

                        scene->addPixmap(QPixmap("2D.png"));
                        ui->graphicsView_inputImage->setScene(scene);

                        // taking the size of the loaded image
                        

                        ui->label_4->setText(QString("size x:%1").arg(size_x));
                        ui->label_5->setText(QString("size y:%1").arg(size_y));
                        ui->label_6->setText(QString("size z:%1").arg(size_z));

                        return;
                        

                        }

                        void MainWindow::mousejustpressed(int x,int y)
                        {
                        int k1=256-y;

                        unsigned char value;

                        QImage image(scene->sceneRect().size().toSize(),
                        QImage::Format_RGB32);

                        QPainter painter(&image);
                        scene->render(&painter);

                        value=image.pixel(x,k1);

                        ui->label->setText(QString("x:%1").arg(x));
                        ui->label_2->setText(QString("y:%1").arg(k1));
                        

                        ui->label_3->setText(QString("pixel value:%1").arg(value));

                        }

                        MainWindow::~MainWindow()
                        {
                        delete ui;
                        }
                        @

                        1 Reply Last reply
                        0
                        • J Offline
                          J Offline
                          jim_kaiser
                          wrote on last edited by
                          #12

                          A little late.. but the problem jk_mk is in your connect statement :D

                          @
                          connect(ui->verticalScrollBar_z, SIGNAL(valueChanged(int x)),
                          this, SLOT(push_button_File(int x)));
                          @

                          what you're doing wrong is writing the variable names in the connect. You need to only specify the type. So that should instead be:

                          @
                          connect(ui->verticalScrollBar_z, SIGNAL(valueChanged(int)),
                          this, SLOT(push_button_File(int)));
                          @

                          Just "int" not "int x" in the connect statement.. that should solve your problem.

                          1 Reply Last reply
                          0
                          • J Offline
                            J Offline
                            jk_mk
                            wrote on last edited by
                            #13

                            Yes, this has solved my problem. Thanks a lot. But I have noticed something strange in my program when I use this event of scrollbar.To be more specific I use this event to display slices of 3D volume in a QGraphicsScene. When I change the value of the QScrollbar slowly then I do not have any problem concerning the display of my image. But when I change the value of QScrollbar Quickly, then my image is diaplayed with a little delay.
                            What do you think that is responsible for this problem? Might it be the code included in the function? Might it be too long?Or the reason for this problem is that every time firstly I save the slice as png file in memory and after that I display the image in the QGraphicsView?

                            Thanks

                            1 Reply Last reply
                            0
                            • J Offline
                              J Offline
                              jim_kaiser
                              wrote on last edited by
                              #14

                              Hmm... if you are accessing the filesystem in the slot, then it would be slow. Accessing the hard disk is many orders slower than accessing your RAM. Load your 3D Model/2D images in memory (i.e RAM) and then use it/them in the slot.

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved