QGroupBox的子限制缩小格式

时间:2019-03-25 14:45:09

标签: c++ qt qt5

我有一个多屏幕视频播放器,我只想保持16:9的比例。有一个qgroupbox作为qwidget的容器​​,在其中播放视频。我还使用qgroupbox通过将边框绘制为绿色来显示选定的帧。我无法在qwidget上执行此操作,因为渲染的视频与之重叠。完成调整大小后,我会发出带有mouseup事件的信号,以便能够通知调整操作已完成。然后,我为qwidget计算新边界以保持16:9的比例,并将此值应用于qwidget。这是向您显示我的应用程序外观的图像: application window with 4 qgropboxes 这是我用来调整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),然后会出现方向问题。这是此问题的示例:

orientation problem when use resize()

下面的代码显示了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(),所有这些东西都没用。我想念什么?我需要你的帮助。任何帮助,将不胜感激。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

删除容器组框中的网格布局。而是使用// Fixed. No more infinite loop. int num, status; while (1) { printf("Enter a number: "); status = scanf("%d", &num); if (status == 1) printf("OK\n"); else { printf("Invalid number\n"); // Consume the bad input, so it doesn't keep getting re-read by scanf int ch; while ((ch = getchar()) != '\n' && ch != EOF) ; if (ch == EOF) break; } }

调整视频小部件的大小并调整其大小

这是我制作的setGeometry的一个简单子类,它保持您想要的比例并始终位于中心:

QGroupBox

您的整个ctor都将变为:

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;
};

您当然可以通过任意方式公开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); } } } 来访问视频小部件。通过将其公开或创建一个getter函数。