c++ - 如何在不视觉上使用滚动条的情况下更改视图
问题描述
我想做的是这个,我有一个程序,它充满了图像,这些图像离开屏幕,所以显然可以在这里使用 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");
}
}
解决方案
获得该行为的最简单方法是使您的小部件成为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();
}
推荐阅读
- python - 字典的迭代
- python-3.x - 我可以让服务器打开 html 而不是下载它吗?如果我可以怎么办?
- python - 我应该使用板载视频来释放我的 GPU 用于 tensorflow 吗?
- typescript - 使用 Typescript 实现通用柯里化函数
- command-line-interface - 如何使用 gmail 身份验证创建 bitbucket 拉取请求
- redis - 在 Redis 中使用 Hset 和 HMSet 哪一个?
- javascript - 将脚本标签中的变量传递给 Vue 实例
- android - 执行 Detox 测试命令后出现 DetoxRuntimeError
- html - 如何在悬停时更改 div 中的多个块?
- ssis - SSIS 连接何时发生?