我正在使用QGraphicsView框架来显示较小的QPixmap图块中的大图像。我还想启用抗锯齿,因为场景将包含行项目。当我启用Antialiasing时,为什么会看到切片之间的间隙?
class MainWindow : public QWidget
{
public:
MainWindow(QWidget *parent = 0);
protected:
void resizeEvent(QResizeEvent*);
private:
QGraphicsScene* _scene;
QGraphicsView* _view;
qreal _scale;
static const int _imageWidth = 512;
static const int _imageHeight = 128;
};
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
_scene = new QGraphicsScene(this);
_view = new QGraphicsView(_scene, this);
//this causes gaps to appear ?
_view->setRenderHints(QPainter::Antialiasing);
_scene->setBackgroundBrush( QBrush( QColor( Qt::lightGray ) ) );
QHBoxLayout *layout = new QHBoxLayout(this);
layout->addWidget(_view);
setWindowTitle(QString("GapsBetweenTiles- QT Version %1")
.arg(QT_VERSION_STR));
QImage img = QImage(_imageWidth, _imageHeight, QImage::Format_RGB32);
img.fill(QColor(00, 50, 50));
int offset = 0;
for (int k=0; k < 10; ++k) {
QGraphicsPixmapItem* pixitem = _scene->addPixmap(
QPixmap::fromImage(img));
pixitem->setTransformationMode(Qt::SmoothTransformation);
pixitem->setPos(0, offset);
offset += _imageHeight;
}
_scale = 1.0;
}
void MainWindow::resizeEvent(QResizeEvent* )
{
int scaledWidth = (qreal)_view->width() -
_view->verticalScrollBar()->width() ;
qreal scale = (qreal)scaledWidth / (qreal)_imageWidth;
qreal scaleMult = scale / _scale;
_view->scale(scaleMult, scaleMult);
_scale = scale;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
答案 0 :(得分:1)
当缩放图像高度(_imageHeight * scale
)变为小数时,会出现间隙。
每个QGraphicsPixmapItem
都被绘制为一个单独的对象。如果此对象具有小数高度,则在启用消除锯齿时会对边框进行平滑处理(部分绘制部分边界线)。
您的案例中有三种可能的间隙布局:
因此,如果您想要完美的对象对齐,则缩放高度应为整数。
在您的示例中,当缩放宽度可被4整除时,缩放高度为整数。
可以通过在resizeEvent
中添加以下行来验证:
scaledWidth = (scaledWidth / 4) * 4;
顺便说一句,你可以通过删除行来禁用QGraphicsPixmapItem
个对象的抗锯齿:
pixitem->setTransformationMode(Qt::SmoothTransformation);