QT如何使用scrollarea和Label(或者TextEdit)显示很多的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT如何使用scrollarea和Label(或者TextEdit)显示很多的内容相关的知识,希望对你有一定的参考价值。

会调用scrollarea窗口显示图片,窗口大小能根据图片大小自动调整,但是最大为1024*768,图片过大就要有滚动条来显示

mainwindow中点击“显示图片”调用scrollarea窗口,下面的函数是被一个按钮的槽函数调用的

void MainWindow::Show_Image_byname(char *filename)

if(!filename || !strlen(filename))

return;

char buf[128]= 0;
strcpy(buf,SAVE_IMAGE);
strcat(buf,filename);
ScrollArea *new_image = new ScrollArea();
new_image->set_image(buf);
new_image->setBackgroundRole(QPalette::Dark);
new_image->show();
return;


添加文件scrollarea.ui文件,画出一个scrollarea

在生成的scrollarea.h中添加私有成员QLabel

private:
Ui::ScrollArea *ui;
QLabel * label;

在析构函数中添加内存释放

ScrollArea::~ScrollArea()

delete ui;
if(label)

delete label;



在生成的scrollarea.cpp中添加图片显示实现函数

void ScrollArea::set_image(char *filename)

QImage *ppm = new QImage(filename);
label = new QLabel();
printf("ppm->width()=%d, ppm->height()=%d\n",ppm->width(), ppm->height()); //获取图片的宽度和高度
label->setPixmap(QPixmap::fromImage(*ppm));
this->setWidget(label);
/*设置窗口最大高度和宽度为1024*768*/
this->setMaximumHeight(768);
this->setMaximumWidth(1024);
this->resize(QSize( ppm->width()+5, ppm->height() +5));
return;
参考技术A 你可以使用Scroll Area,即可满足你需要的组合效果,即显示更多内容

Qt 自定义小部件如何通知 ScrollArea 父级视图更改

【中文标题】Qt 自定义小部件如何通知 ScrollArea 父级视图更改【英文标题】:How does a Qt custom widget notify ScrollArea parent about change of view 【发布时间】:2011-05-18 06:23:27 【问题描述】:

我正在编写一个图像查看器作为自定义 Qt 小部件(请参阅:https://github.com/dov/Qviv),我现在陷入了如何让我的小部件通知父 QScrollArea 视口中的更改的问题,从而告诉它移动滚动条。例如。如果图像查看器因按键而更改缩放因子,则滚动条需要更改其页面大小。

这样做的一种方法是让小部件显式检查父级是否为 QScrollArea,然后显式调用其方法以在任何更改时通知它。

当然,我还需要将 ScrollArea 的变化连接到图像的内部视图,但这是一个不同的问题。而且我需要削减无限递归,其中小部件报告更改为滚动条报告小部件的更改等。

编辑周三 20:15 (GMT/UTC) 试图向 Vjo 和我自己澄清我需要什么。

我想要实现的是相当于一个 Gtk 小部件,它被分配了一对连接到水平和垂直滚动条的 GtkAdjustment。在我的小部件 GtkImageViewer 中,基于 QvivImageViewer,每当我由于某些内部事件(例如按键)而更改视图时,我都会更新 GtkAdjustment。滚动条与此类更改相关联并相应更新。 GtkImageViewer 还监听 GtkAdjustment 的变化,因此如果用户滚动滚动条,GtkImageViewer 会使用此信息更新并可以更改其视图。我的问题是 Qt 中是否有任何类似于 GtkAdjustment 的东西可以连接到进行更改,并且在这种情况下更新将传播到所有侦听器?

因此我不希望 ScrollArea 成为 QvivImageViewer 的一部分,但如果用户将 QvivImageViewer 放置在 ScrollArea 中,我希望与它进行双向通信,以便滚动条反映小部件的内部状态。

【问题讨论】:

【参考方案1】:

最简单的方法是将QResizeEvent 事件从您的小部件对象发送到 QScrollArea 对象。

【讨论】:

QResizeEvent 如何帮助我告诉 ScrollArea Scrolling PageSize 发生了变化? @dov 首先,我在您的代码中的任何地方都看不到 QScrollArea。其次,我检查了 QScrollArea 类的参考页面,发现它可以处理 QResizeEvent :doc.qt.nokia.com/latest/qscrollarea.html#resizeEvent。如果我没有正确理解你的问题,你能更好地解释一下你的类之间的关系吗?【参考方案2】:

我终于下载了 Qt 源码并研究了 QTextEdit 是如何做到的。我发现QTextEdit 自己继承了QAbstractScrollArea,因此滚动区域和滚动条是小部件的一部分。这与 Gtk 不同,后者使用更高级别的抽象,通过它的GtkAdjustment 来表示滚动条和小部件之间的变化。 Qt 模型更简单,这就是我将在我的小部件中实现它的方式。

【讨论】:

【参考方案3】:

已经有一段时间了,但我遇到了同样的问题。

如果您愿意,可以继承 QAbstractScrollArea,但 QScrollArea 也可以。

您的自定义内部小部件(即您正在滚动的小部件)在其大小发生变化时应执行以下操作:

void MyCustomControl::resize_me() 
  // recompute internal data such that sizeHint() returns the new size
  ...
  updateGeometry();
  adjustSize();


QSize MyCustomControl::sizeHint() 
  return ... ; // Return my internally computed size.

我错过了adjustSize() 调用,没有它QScrollArea 将忽略内部小部件的大小变化。

【讨论】:

以上是关于QT如何使用scrollarea和Label(或者TextEdit)显示很多的内容的主要内容,如果未能解决你的问题,请参考以下文章

qt里如何实现点一下按钮,就把一个界面显示到当前界面上的scrollArea里,具体怎么做,最好给个例子

Qt,Designer 在scrollArea 中创建scrollAreaWidgetContents,我无法调整图像标签的大小

如何在Qt Designer中限制布局的增长(大小)?

关于qt随机值传递给label问题

qt图形界面编程如何调用对象指针?

QT MainWindow 滚动条