首页 > 解决方案 > 如何在不视觉上使用滚动条的情况下更改视图

问题描述

我想做的是这个,我有一个程序,它充满了图像,这些图像离开屏幕,所以显然可以在这里使用 QScrollBar。我想知道是否有可能代替必须滚动的可视栏,您可以像按向右箭头键或向左箭头键滚动一样?就像我可以在重写的 keyPressEvent 中调用一个函数来改变视图一样吗?

我确实有一个想法,虽然当我打印图片时我可以有一个偏移量,所以当我按下右或左箭头键时,它会从一个整数中添加或减去一个数字,这样它就可以添加到绘画算法中的 x 坐标打印图像以人为地改变视图?

private:
    int xOffset;
public:

    void keyPressEvent(QKeyEvent *e) override
    {
        if(e->key() == Qt::RightArrow)
        {
            ++xOffset;
        }
        if(e->key() == Qt::LeftArrow)
        {
            --xOffset;
        }
} 

然后在绘画事件中将偏移量添加到图像的 x 以更改视图

paint(QPainter *qp)
{
for(int l{0}; l < M_images; ++l)
{
   qp.fillRect(M_x+xOffset, M_y, 50, 50, "Pic.png");
}
}

标签: c++qt

解决方案


获得该行为的最简单方法是使您的小部件成为QScrollArea小部件的目标。QScrollArea 将为您处理按键和滚动/偏移渲染,并提供滚动条(如果您需要它们 - 如果您不这样做,它们不是强制性的;请参阅下面示例底部附近的注释)

#include <QApplication>
#include <QGridLayout>
#include <QMainWindow>
#include <QScrollArea>
#include <QPushButton>

int main(int argc, char ** argv)
{
   QApplication app(argc, argv);

   QMainWindow * mw = new QMainWindow;
   mw->setWindowTitle("QScrollArea demo -- press arrow keys!");

   QScrollArea * sa = new QScrollArea;
   mw->setCentralWidget(sa);

   QWidget * scrollMe = new QWidget;
   QGridLayout * gl = new QGridLayout(scrollMe);
   for (int row=0; row<99; row++)
   {
      for (int col=0; col<99; col++)
      {
         QPushButton * pb = new QPushButton(QString("%1.%2").arg(row+1).arg(col+1));
         gl->addWidget(pb, row, col);
      }
   }
   sa->setWidget(scrollMe);

   // Comment these two lines out if you want visible scroll bars
   sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
   sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

   mw->resize(500, 500);
   mw->show();

   return app.exec();
}

推荐阅读