how to select an image in a scroll area?



  • I have written the code below in order to load images in a scroll area. now on I want to select an image an apply zoom in and zoom out actions on the selected image. how can I do that?
    mainwindow.cpp

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        layout = ui->verticalLayout_5;
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_actionOpen_triggered()
    {
    
    
        QString directory = QFileDialog::getExistingDirectory(this,
                                                              tr("Open Directory"),
                                                              QDir::homePath(),
                                                              QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
        int nrows = 1;
        int ncols = 1;
        HorizontalScrollArea *scroll = new HorizontalScrollArea(nrows, ncols);
        layout->addWidget(scroll);
        QDir dir(directory);
        dir.setNameFilters({"*.png", "*.jpg"});
        for(const QFileInfo & finfo: dir.entryInfoList()){
            int column = scroll->columnCount();
            for(int row=0; row < nrows; row++){
                QPixmap pic(finfo.absoluteFilePath());
                QImage image(finfo.absoluteFilePath());
                QLabel *label = new QLabel();
                label->setFrameShape(QFrame::WinPanel);
                label->setFrameShadow(QFrame::Raised);
                label->setAlignment(Qt::AlignCenter);
    
                label->setPixmap(pic.scaled(600,500,Qt::KeepAspectRatio));
                scroll->addWidget(label, row, column);
            }
        }
    }
    

    horizontalscrollarea.h

    class HorizontalScrollArea : public QScrollArea
    {
        QWidget *contentWidget;
        QGridLayout *grid;
        int nRows;
        int nColumns;
    public:
        HorizontalScrollArea(int rows, int cols, QWidget *parent = Q_NULLPTR)
            :QScrollArea(parent), nRows(rows), nColumns(cols)
        {
            setWidgetResizable(true);
            contentWidget = new QWidget(this);
            setWidget(contentWidget);
            grid = new QGridLayout(contentWidget);
            setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        }
    
        void addWidget(QWidget *w, int row, int col){
            grid->addWidget(w, row, col);
            adaptSize();
        }
    
        int columnCount() const{
            if(grid->count() == 0){
                return 0;
            }
            return grid->columnCount();
        }
    
    private:
        void adaptSize(){
            if(columnCount() >= nColumns ){
                int w = 1.0*(width() - grid->horizontalSpacing()*(nColumns+1.6))/nColumns;
                int wCorrected = w*columnCount() + grid->horizontalSpacing()*(columnCount()+2);
                contentWidget->setFixedWidth(wCorrected);
            }
            contentWidget->setFixedHeight(viewport()->height());
        }
    protected:
        void resizeEvent(QResizeEvent *event){
            QScrollArea::resizeEvent(event);
            adaptSize();
        }
    };
    

  • Qt Champions 2017

    Hi and welcome to the forums
    You could use something like
    https://wiki.qt.io/Clickable_QLabel
    to make it able to detect mousePress.

    It just set text color so you need to tell what type of effect you had in mind ?
    One option is to also override paintEvent and paint the effect using QPainter.
    for more advanced stuff, there is also
    http://doc.qt.io/qt-5/qgraphicseffect.html#details


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.