2010-06-05 4 views
4

Tout d'abord, merci de m'avoir donné le temps de lire ma question.Le contenu du widget QScrollArea a été promu à QWidget

J'ai créé mon propre Qt Widget (parent de QWidget) et j'ai un QImage "inside" pour manipuler les images. Le problème que j'ai est le suivant: quand je favorise le contenu d'un QScrollArea (QDesigner) à mon widget, les caractéristiques de défilement ne fonctionnent pas; Je n'ai pas de barre de défilement ou je ne vois aucun résultat lorsque j'utilise la méthode 'ensureVisible (..)'.

S'il vous plaît pouvez-vous me dire si je dois surcharger ou remplacer toute méthode dans mon propre widget. Cordialement et merci d'avance, Oscar.


code: L'intention est d'utiliser directement MyWidget (promotion dans QDesigner) et je ne pas utiliser directement cos » QImage Je veux sauver des données supplémentaires dans le widget.

struct myData 
{ 
    QImage myImage; 
}; 

myWidget::myWidget(QWidget* parent, Qt::WFlags fl) : QWidget(parent, fl) 
{ 
    myData = new myData(); 
} 

myWidget::~myWidget() 
{ 
    delete myData; 
} 

void myWidget::init(QImage image) 
{ 
    try 
    { 
     myData->myImage = image; 
     resize(myData->myImage->width, myData->myImage->height); 
    } 
    catch(...) 
    { 
     QString msg("myWidget::init return error\n"); 
     qWarning(msg.toLatin1().data()); 
     return; 
    } 
} 

QSize myWidget::minimumSize() const { 
    return myData->myImage.size(); 
} 

QSize myWidget::sizeHint() const { 
    return myData->myImage.size(); 
} 

void myWidget::paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 
    painter.drawImage(myData->myImage.rect(), myData->myImage); 
} 

void myWidget::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) { 
     emit mousePress(event->x(), event->y()); 
    } 
} 

void myWidget::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::RightButton) { 
     emit mouseMove(event->x(), event->y()); 
    } 
} 
+0

Je pense que vous avez besoin d'ajouter du code à votre question ... – mosg

+0

@mosg le code du widget est disponible. Merci pour votre suggestion. – ocell

Répondre

1

J'ai quelque chose comme ça à quelques reprises et il peut être déroutant d'avoir tous les signaux corrects. Tout d'abord, jetez un oeil à la Image Viewer Example. Cela répondra probablement à la plupart de vos questions. Il y a deux sections clés à regarder. Le premier est le code de mise à l'échelle -

void ImageViewer::scaleImage(double factor) 
{ 
    Q_ASSERT(imageLabel->pixmap()); 
    scaleFactor *= factor; 
    imageLabel->resize(scaleFactor * imageLabel->pixmap()->size()); 

    adjustScrollBar(scrollArea->horizontalScrollBar(), factor); 
    adjustScrollBar(scrollArea->verticalScrollBar(), factor); 

    zoomInAct->setEnabled(scaleFactor < 3.0); 
    zoomOutAct->setEnabled(scaleFactor > 0.333); 
} 

Ensuite, les barres de défilement doivent être ajustées. Ce code est -

 void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor) 
{ 
    scrollBar->setValue(int(factor * scrollBar->value() 
          + ((factor - 1) * scrollBar->pageStep()/2))); 
} 

J'ai trouvé ce code échantillon résolu environ 75% de mes problèmes en essayant de quoi que ce soit avec une image à l'intérieur d'une zone de défilement.

+0

merci pour le code et pour le pourboire mais je ne veux pas ajouter une instance de barre de défilement dans le widget. Je veux utiliser une zone de défilement (dans QDesigner) et promouvoir le contenu de mon propre widget. Encore une fois, merci pour votre temps et pour le pourboire. – ocell

Questions connexes