На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> QScrollView , есть ли аналог в QT4?
    Есть ли в Qt4 нечто подобное виджету прокрутки QScrollView из Qt3?
    Или в нем нет необходимости?! - насколько я понял, в Qt4 полосы прокрутки создаются автоматически, например, если размер картинки превышает размер формы...
    Сообщение отредактировано: SectoRz -
      QAbstractScrollArea
        Опять я что-то делаю не так...

        Пробовал добавить скроллбары в wgt и lbl с использованием:

        QAbstractScrollArea
        QScrollArea
        QScrollBar

        Вот код:
        ExpandedWrap disabled
          #include<QtGui>
          int main(int argc, char *argv[])
          {
            QApplication app(argc, argv);
            
            QWidget wgt;
            wgt.setWindowTitle("MyWidget");
            wgt.resize(300, 300);
            wgt.setCursor(Qt::PointingHandCursor);
           
            QColor red(Qt::red);
            QPalette pl; pl.setColor (QPalette::Active, QPalette::Window, red);
            wgt.setAutoFillBackground(true);
            wgt.setPalette(pl);
           
            //QLabel *lbl = new QLabel(&wgt);
            //lbl->setText("<img src=\"..\\root.jpg\">");
            //lbl->move(  (wgt.width()-150)/2, (wgt.height()-150)/2 );
            //lbl->setCursor(Qt::ArrowCursor);
            
            QPixmap pix("..\\root.jpg");
            QLabel *lbl = new QLabel(&wgt);
            lbl->setPixmap(pix); lbl->resize(125, 125);  
            lbl->show();
            
            // Scroll проба 0:
            QScrollArea scrollArea;
            scrollArea.setBackgroundRole(QPalette::Dark);
            scrollArea.setWidget(lbl);
            
          /*  
            // Scroll проба 1:
           
            QAbstractScrollArea sa(&wgt);
            QScrollBar sb;
            sa.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
            sa.setHorizontalScrollBar(&sb);
          */  
          /*  
            // Scroll проба 2:
            
            QSize lbl_sz=lbl->size();
            QSize wgt_sz=wgt.size();
            
            scroll.horizontalScrollBar()->setPageStep( wgt_sz.width() );
            scroll.verticalScrollBar()->setPageStep( wgt_sz.height() );
            
            scroll.horizontalScrollBar()->setRange(0, wgt_sz.width() - 150 );
            scroll.verticalScrollBar()->setRange(0, wgt_sz.height() - 150 );
            
            //  updateWidgetPosition(); // чей член - хз?...
            */
            
            wgt.show();
            return app.exec();
          }


        Уже если чесtно надоело возиться...

        0-ой вариант (из примера Qt Assistant) - не отображает lbl с картинкой.
        Остальные варианты (проба 1, проба 2) работаю криво... что-то похожее на скролл отображается(

        Был же в Qt3 нормальный класс QScrollView зачем было его дробить на кучу подклассов...
        Сообщение отредактировано: SectoRz -
          доки нужно читать внимательней:
          http://doc.trolltech.com/qtopia4.2/qscrollarea.html
          ExpandedWrap disabled
            #include <QApplication>
            #include <QScrollArea>
            #include <QLabel>
            int main( int argc, char* argv[ ] )
            {
                QApplication a( argc, argv );
                QLabel *imageLabel = new QLabel;
                QImage image("C:/ttt.bmp");
                imageLabel->setPixmap(QPixmap::fromImage(image));
             
                QScrollArea *scrollArea = new QScrollArea;
                scrollArea->setBackgroundRole(QPalette::Dark);
                scrollArea->setWidget(imageLabel);
                scrollArea->show( );
                return a.exec( );
            }
            Может быть попробовать хоть немного посоображать чё пишем?
            ExpandedWrap disabled
                QPixmap pix("..\\root.jpg");
                QLabel *lbl = new QLabel(&wgt); // label - child of wgt
                lbl->setPixmap(pix); lbl->resize(125, 125);  
                lbl->show();
                
                // Scroll проба 0:
                QScrollArea scrollArea; // scrollArea - child of NOTHING
                scrollArea.setBackgroundRole(QPalette::Dark);
                scrollArea.setWidget(lbl); // label becomes child of scrollArea(результат надо понимать пустое окошко?)
              Цитата sploid @
              доки нужно читать внимательней:
              http://doc.trolltech.com/qtopia4.2/qscrollarea.html

              Да я и так Qt Ассистент кручу верчу как могу - но постоянно упускаю некоторые детали(((

              Добавлено
              Я ведь так и сделал - только вот метод scrollArea->show( ); не вызвал...
                Цитата SectoRz @
                только вот метод scrollArea->show( ); не вызвал...

                Его и не надо было вызывать в твоём случае.


                Цитата SectoRz @
                но постоянно упускаю некоторые детали(((

                Это не детали, а базовые понятия. Каждый виджет должен принадлежать другому виджету. Только toplevel виджет никому не принадлежит и для него надо делать show.
                  Цитата archimed7592 @
                  Его и не надо было вызывать в твоём случае.

                  как же не надо - без него нет скролла!...
                    Оч просто:
                    ExpandedWrap disabled
                        QWidget wgt;
                        wgt.setWindowTitle("MyWidget");
                        wgt.resize(300, 300);
                        wgt.setCursor(Qt::PointingHandCursor);
                       
                        QColor red(Qt::red);
                        QPalette pl; pl.setColor (QPalette::Active, QPalette::Window, red);
                        wgt.setAutoFillBackground(true);
                        wgt.setPalette(pl);
                       
                        //QLabel *lbl = new QLabel(&wgt);
                        //lbl->setText("<img src=\"..\\root.jpg\">");
                        //lbl->move(  (wgt.width()-150)/2, (wgt.height()-150)/2 );
                        //lbl->setCursor(Qt::ArrowCursor);
                        
                        QPixmap pix("..\\root.jpg");
                        // QLabel *lbl = new QLabel(&wgt); // неправильно - lbl должна принадлежать sсrollArea, а не wgt
                        QLabel *lbl = new QLabel(); // lbl никому не принадлежит
                        lbl->setPixmap(pix); lbl->resize(125, 125);  
                        lbl->show();
                        
                        // Scroll проба 0:
                        // QScrollArea scrollArea; // неправильно - scrollArea должна принадлежать wgt, а не абстрактно воображаемому Ктулху
                        QScrollArea scrollArea(&wgt); // scrollArea принадлежит wgt
                        scrollArea.setBackgroundRole(QPalette::Dark);
                        scrollArea.setWidget(lbl); // здесь lbl начинает принадлежать scrollArea


                    Добавлено
                    Предупрежу последующий вопрос: если хочешь запихнуть в виджет несколько объектов, то нужно использовать менеджеры компоновки(QXXXLayout).
                      Щас проверю!

                      Но можно ведь и вот так написать:
                      ExpandedWrap disabled
                          QPixmap pix("..\\root.jpg");
                          QLabel *lbl = new QLabel(&wgt);
                          lbl->setPixmap(pix); lbl->resize(125, 125);  
                          lbl->show();
                          
                          QScrollArea scrollArea;
                          scrollArea.setPalette(pl);
                          scrollArea.setWidget(lbl);
                          scrollArea.show();


                      Добавлено
                      Спасибо! С лейаутами я уже разобрался)
                        Цитата SectoRz @
                        Но можно ведь и вот так написать:

                        А ты напиши вот так и поймёшь о чём я говорю:

                        ExpandedWrap disabled
                            QWidget wgt;
                            wgt.setWindowTitle("MyWidget");
                            wgt.resize(300, 300);
                            wgt.setCursor(Qt::PointingHandCursor);
                           
                            QColor red(Qt::red);
                            QPalette pl; pl.setColor (QPalette::Active, QPalette::Window, red);
                            wgt.setAutoFillBackground(true);
                            wgt.setPalette(pl);
                           
                            //QLabel *lbl = new QLabel(&wgt);
                            //lbl->setText("<img src=\"..\\root.jpg\">");
                            //lbl->move(  (wgt.width()-150)/2, (wgt.height()-150)/2 );
                            //lbl->setCursor(Qt::ArrowCursor);
                            
                            QPixmap pix("..\\root.jpg");
                            // QLabel *lbl = new QLabel(&wgt); // неправильно - lbl должна принадлежать sсrollArea, а не wgt
                            QLabel *lbl = new QLabel(); // lbl никому не принадлежит
                            lbl->setPixmap(pix); lbl->resize(125, 125);  
                            lbl->show();
                            
                            // Scroll проба 0:
                            // QScrollArea scrollArea; // неправильно - scrollArea должна принадлежать wgt, а не абстрактно воображаемому Ктулху
                            QScrollArea scrollArea(&wgt); // scrollArea принадлежит wgt
                            scrollArea.setBackgroundRole(QPalette::Dark);
                            scrollArea.setWidget(lbl); // здесь lbl начинает принадлежать scrollArea
                            scrollArea.show(); // <<<<<<<<<<<<<<<<<<<===========================================
                          Со стройчкой
                          ExpandedWrap disabled
                            scrollArea.show();

                          и без нее в твоем последнем коде - результат одинаков!

                          Ну да ладно - щас разберусь...
                            Ан нет... Я имел ввиду твой оригинальный вариант, а не мой исправленный. Скопипастил не оттуда.
                            Попробуй код из 3-го поста с добавлением scrollArea.show();.
                              окей

                              Добавлено
                              Ты имел ввиду, что область прокрутки, содержащая рисунок создастся как отдельный виджет (т.е. в новом окне)?!

                              Ну так я в лейаут эту область и вставил:
                              ExpandedWrap disabled
                                  QHBoxLayout hbox;
                                  
                                  QPixmap pix("..\\root.jpg");
                                  QSize pix_sz=pix.size();
                                  QLabel *lbl = new QLabel(&wgt);
                                  lbl->setPixmap(pix); lbl->resize( pix_sz.width(), pix_sz.height() );  
                                  // hbox.addWidget(lbl);
                                  // lbl->show();
                                  
                                  QScrollArea scrollArea;
                                  scrollArea.setPalette(pl);
                                  scrollArea.setWidget(lbl);
                                  
                                  hbox.addWidget(&scrollArea);
                                  //scrollArea.scroll(100, 100);
                                  
                                  scrollArea.show();  
                                  wgt.setLayout(&hbox);
                                А вот вариант, когда ScrollArea принадлежит wgt:
                                ExpandedWrap disabled
                                    QPixmap pix("..\\root.jpg");
                                    QSize pix_sz=pix.size();
                                    // QLabel *lbl = new QLabel(&wgt); // неправильно - lbl должна принадлежать sсrollArea, а не wgt
                                    QLabel *lbl = new QLabel(); // lbl никому не принадлежит
                                    lbl->setPixmap(pix); lbl->resize( pix_sz.width(), pix_sz.height() );  
                                    lbl->show();
                                    
                                    QScrollArea scrollArea(&wgt); // scrollArea принадлежит wgt
                                    scrollArea.setBackgroundRole(QPalette::Dark);
                                    scrollArea.setWidget(lbl); // здесь lbl начинает принадлежать scrollArea
                                    
                                    QScrollBar sb1, sb2;
                                    scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                                    scrollArea.setHorizontalScrollBar(&sb1);
                                    
                                    scrollArea.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
                                    scrollArea.setVerticalScrollBar(&sb2);
                                    
                                    sb1.show(); sb2.show(); scrollArea.show();


                                Теперь скроллбары отображаются, только толку от них, т.к. размер scrollArea = размеру lbl, кот. в свою очередь = размеру картинки...

                                Добавлено
                                Хотя, если после этого написать:
                                ExpandedWrap disabled
                                  lbl->resize( 300, 300 );

                                , то скроллы начинают действовать ( и QPalette::Dark становится заметен ;-) )!

                                В общем разобрался...

                                Archimed7592'у и Sploid'у '+' за содействие!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0477 ]   [ 16 queries used ]   [ Generated: 30.04.24, 16:42 GMT ]