2010-06-05 97 views
4

首先,感謝您閱讀我的問題。QScrollArea小部件內容提升爲QWidget

我創建了我自己的Qt Widget(QWidget的父類),並有一個QImage「內部」來操作圖像。我遇到的問題如下:當我將QScrollArea(QDesigner)的內容提升到我的小部件時,滾動功能不起作用;我沒有任何滾動條,或者當我使用方法'ensureVisible(..)'時看不到任何結果。

請你能告訴我,如果我需要重載或重寫我自己的小部件中的任何方法。

感謝致謝, 奧斯卡。


代碼:我們的目的是直接使用進myWidget(在QDesigner促進它),我不直接使用QImage的「因爲我想保存在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

我認爲你需要給你的問題添加一些代碼... – mosg 2010-06-05 12:15:29

+0

@mosg小部件的代碼是可用的。感謝您的建議。 – ocell 2010-06-05 16:55:27

回答

1

我有這樣的幾次,它可以混淆獲取所有的信號正確。首先,看看Image Viewer Example。它可能會回答你的大部分問題。有兩個關鍵部分要看。首先是縮放代碼 -

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); 
} 

然後,滾動條必須調整。該代碼是 -

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

我發現這個示例代碼解決了大約75%的問題,當嘗試任何與滾動區域內的圖像。

+0

感謝代碼和提示,但我不想在小部件中添加滾動條的實例。我想使用Scroll Area(在QDesigner中)並將內容提升到我自己的小部件。再一次感謝您的時間和提示。 – ocell 2010-06-05 16:59:48