c++ - QGroupBox 的子限制缩小表格
问题描述
我有一个多屏视频播放器,我只想保持 16:9 的比例。有一个 qgroupbox 作为 qwidget 的容器,可以在其中播放视频。我还使用 qgroupbox 通过将边框绘制为绿色来显示选定的帧。我不能在 qwidget 上执行此操作,因为渲染的视频与此重叠。当我完成调整大小后,我会发出一个带有 mouseup 事件的信号,以便能够通知调整大小操作已完成。然后我计算 qwidget 的新界限以保持 16:9 的比率并将此值应用于 qwidget。这是向您展示我的应用程序外观的图像: 这是我用来调整 qwidgets 大小的代码:
void playBack::OnWindowResized()
{
float ratio = 16.0f / 9.0f;
float w = playBackplayer_contList.at(0)->size().width(); //qgroupbox's width
float h = playBackplayer_contList.at(0)->size().height();//qgroupbox's height
float currentRatio = w / h;
float newW = 0;
float newH = 0;
if (currentRatio > ratio)
{
newH = h;
newW = h*ratio;
}
else if (currentRatio < ratio)
{
newW = w;
newH = w / ratio;
}
qDebug() << "NEW WIDGET SIZE: " << (int)newW << " x " << (int)newH;
for (int i = 0; i < playBackplayer_widgtList.count(); i++)
{
playBackplayer_widgtList.at(i)->setMinimumSize(newW, newH);
//playBackplayer_widgtList.at(i)->resize(newW, newH);
}
}
当我放大表格时,这段代码可以完美运行,但是当我想缩小时,它不允许我这样做。因为我为 qwidgets 设置了一个最小值。如果我不使用 setMinimumSize,请改用 resize(w,h),而不是出现方向问题。这是这个问题的一个例子:
下面的代码显示了 ctor,这是我设置布局的地方:
playBack::playBack()
{
playback_player_1_widget = new QWidget;
playback_player_2_widget = new QWidget;
playback_player_3_widget = new QWidget;
playback_player_4_widget = new QWidget;
playback_player_1_widget_cont = new QGroupBox;
playback_player_2_widget_cont = new QGroupBox;
playback_player_3_widget_cont = new QGroupBox;
playback_player_4_widget_cont = new QGroupBox;
playBackplayer_widgtList.append(playback_player_1_widget);
playBackplayer_widgtList.append(playback_player_2_widget);
playBackplayer_widgtList.append(playback_player_3_widget);
playBackplayer_widgtList.append(playback_player_4_widget);
playBackplayer_contList.append(playback_player_1_widget_cont);
playBackplayer_contList.append(playback_player_2_widget_cont);
playBackplayer_contList.append(playback_player_3_widget_cont);
playBackplayer_contList.append(playback_player_4_widget_cont);
int rowcnt = 0;
int colcnt = 0;
for (int i = 0; i < 4; i++)
{
playBackplayer_contList.at(i)->setStyleSheet(QString("border:1px solid #000;background-color:#000;"));
playBackplayer_widgtList.at(i)->setStyleSheet(QString("background-color:#f00;"));
QGridLayout* layout = new QGridLayout;
layout->setRowStretch(0, 1);
layout->setColumnStretch(0, 1);
layout->setRowStretch(2, 1);
layout->setColumnStretch(2, 1);
playBackplayer_widgtList.at(i)->setMinimumWidth(100);
playBackplayer_widgtList.at(i)->setMinimumHeight(100);
playBackplayer_widgtList.at(i)->setMaximumWidth(10000);
playBackplayer_widgtList.at(i)->setMaximumHeight(10000);
layout->addWidget(playBackplayer_widgtList.at(i),1,1);
layout->setMargin(0);
layout->setSpacing(0);
playBackplayer_contList.at(i)->setLayout(layout);
mainLayout->addWidget(playBackplayer_contList.at(i), colcnt, rowcnt);
rowcnt++;
if (rowcnt % 2 == 0)
{
rowcnt = 0;
colcnt++;
}
playBackplayer_widgtList.at(i)->setAcceptDrops(true);
}
}
我尝试了各种方法,我尝试在调整大小之前为 qwidget 设置大小 0,(在 mousedownevent 中)不起作用,我尝试删除 qgroupbox 的布局,在调整大小发生后,创建新布局并将其设置为 groupbox,即没用,我试过 layout()->adjustSize()、update()、repaint(),所有这些都没用。我错过了什么?我需要你的帮助。任何帮助,将不胜感激。先感谢您。
解决方案
取消容器组框内的网格布局。相反,对齐视频小部件并调整其大小setGeometry
这是QGroupBox
我制作的一个简单子类,它可以保持您想要的比例并始终保持在中心:
class RatioGroupBox : public QGroupBox{
Q_OBJECT
public:
RatioGroupBox(QWidget *parent = nullptr) : QGroupBox (parent){
setFlat(true);
setStyleSheet("border:1px solid #000;background-color:#000;");
setMinimumSize(100, 100);
setMaximumSize(10000, 10000);
ratio = 16.0f/9.0f;
ratioWidget = new QWidget(this);
ratioWidget->setStyleSheet("background: #f00;");
ratioWidget->setAcceptDrops(true);
}
protected:
void resizeEvent(QResizeEvent *){//or you can use your own resize slot
float w = width();
float h = height();
float currentRatio = w/h;
float newW(0);
float newH(0);
if (currentRatio > ratio){
newH = h;
newW = h*ratio;
}
else if (currentRatio < ratio){
newW = w;
newH = w / ratio;
}
ratioWidget->setGeometry((w-newW)/2, (h-newH)/2, newW, newH);
}
private:
QWidget *ratioWidget;
float ratio;
};
您的整个 ctor 将变为:
playBack::playBack()
{
for(int r=0; r<2; r++){
for(int c=0; c<2; c++){
RatioGroupBox* playback_player_cont = new RatioGroupBox;
mainLayout->addWidget(playback_player_cont, c, r);
playBackplayer_contList.append(playback_player_cont);
}
}
}
您当然可以通过ratioWidget
任何您喜欢的方式来访问您的视频小部件。通过将其公开或创建 getter 函数。
推荐阅读
- jquery - 如何检查javascript值是否设置正确
- automation - 使用 UiPath 自动搜索
- reactjs - 如何在没有突变的情况下更新状态数组中的现有值?
- angular - 从浏览器控制台中删除错误消息(Angular HttpClient)
- r - Change Y-axis from exponential to integer
- python - 在 python 脚本中解析输入文件
- python - 如何使用 asyncio 遍历长度不确定的迭代器
- java - Thymeleaf spring 安全方言根本不起作用
- macos - 如何在事件中处理彩虹光标
- reactjs - 我可以将我在 Windows 上开发的应用程序导出到 iPhone 上吗?