Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.194.39] |
|
Сообщ.
#1
,
|
|
|
Есть ли в Qt4 нечто подобное виджету прокрутки QScrollView из Qt3?
Или в нем нет необходимости?! - насколько я понял, в Qt4 полосы прокрутки создаются автоматически, например, если размер картинки превышает размер формы... |
Сообщ.
#2
,
|
|
|
QAbstractScrollArea
|
Сообщ.
#3
,
|
|
|
Опять я что-то делаю не так...
Пробовал добавить скроллбары в wgt и lbl с использованием: QAbstractScrollArea QScrollArea QScrollBar Вот код: #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 зачем было его дробить на кучу подклассов... |
Сообщ.
#4
,
|
|
|
доки нужно читать внимательней:
http://doc.trolltech.com/qtopia4.2/qscrollarea.html #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( ); } |
Сообщ.
#5
,
|
|
|
Может быть попробовать хоть немного посоображать чё пишем?
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(результат надо понимать пустое окошко?) |
Сообщ.
#6
,
|
|
|
Цитата sploid @ доки нужно читать внимательней: http://doc.trolltech.com/qtopia4.2/qscrollarea.html Да я и так Qt Ассистент кручу верчу как могу - но постоянно упускаю некоторые детали((( Добавлено Я ведь так и сделал - только вот метод scrollArea->show( ); не вызвал... |
Сообщ.
#7
,
|
|
|
Цитата SectoRz @ только вот метод scrollArea->show( ); не вызвал... Его и не надо было вызывать в твоём случае. Цитата SectoRz @ но постоянно упускаю некоторые детали((( Это не детали, а базовые понятия. Каждый виджет должен принадлежать другому виджету. Только toplevel виджет никому не принадлежит и для него надо делать show. |
Сообщ.
#8
,
|
|
|
Цитата archimed7592 @ Его и не надо было вызывать в твоём случае. как же не надо - без него нет скролла!... |
Сообщ.
#9
,
|
|
|
Оч просто:
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). |
Сообщ.
#10
,
|
|
|
Щас проверю!
Но можно ведь и вот так написать: 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(); Добавлено Спасибо! С лейаутами я уже разобрался) |
Сообщ.
#11
,
|
|
|
Цитата SectoRz @ Но можно ведь и вот так написать: А ты напиши вот так и поймёшь о чём я говорю: 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(); // <<<<<<<<<<<<<<<<<<<=========================================== |
Сообщ.
#12
,
|
|
|
Со стройчкой
scrollArea.show(); и без нее в твоем последнем коде - результат одинаков! Ну да ладно - щас разберусь... |
Сообщ.
#13
,
|
|
|
Ан нет... Я имел ввиду твой оригинальный вариант, а не мой исправленный. Скопипастил не оттуда.
Попробуй код из 3-го поста с добавлением scrollArea.show();. |
Сообщ.
#14
,
|
|
|
окей
Добавлено Ты имел ввиду, что область прокрутки, содержащая рисунок создастся как отдельный виджет (т.е. в новом окне)?! Ну так я в лейаут эту область и вставил: 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); |
Сообщ.
#15
,
|
|
|
А вот вариант, когда ScrollArea принадлежит wgt:
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, кот. в свою очередь = размеру картинки... Добавлено Хотя, если после этого написать: lbl->resize( 300, 300 ); , то скроллы начинают действовать ( и QPalette::Dark становится заметен ;-) )! В общем разобрался... Archimed7592'у и Sploid'у '+' за содействие! |