gpt4 book ai didi

c++ - qt 删除布局代码

转载 作者:行者123 更新时间:2023-11-30 05:04:26 24 4
gpt4 key购买 nike

我在 QT 方面的经验不到 1 天(这就是我不太了解它的原因)我有一个按布局组织的充满信息(标签、文本、按钮等)的窗口。

我需要在按下一个按钮后隐藏窗口中的所有组件(我已经这样做了)除了一个标签应该增加到几乎与整个窗口一样大

尽管我尝试修改“几何”属性(使用代码),但隐藏的布局不会让标签增加。我还考虑过使用布局中断选项,但标签失去了活力。任何人都可以推荐我做什么吗?谢谢。

有没有人做过这样的事情。谢谢。

最佳答案

我曾经提供过 SO: Qt - How to create Image that scale with window, and keeps aspect ratio? 的答案.实际意图是用原始纵横比缩放 QLabel 中的图像以消耗最大可用尺寸。

但是,我得到的反馈是,当我的标签用于 QGridLayout 时,建议的解决方案将无法正常工作。 (这听起来与 OP 的问题非常相似。)因此,我修改了示例以重现该问题并进行了一些修改。对我来说,似乎主窗口的调整大小事件是在 QGridLayout 中处理的,但仅部分影响布局图像标签。 (应用了收缩但没有增长。)幸运的是,我找到了一个非常简单的解决方法:为 QLabel 设置一个非空框架解决了这个问题。我查看了 woboq.org 上的源代码.我希望得到提示,更改后的框架样式会激活什么(将其应用于我的调整大小问题的修复)。最后实在是不够耐心,搁置了。

除了 QGridLayout 调整大小问题中的 QLabel 之外,更改小部件的可见性应该会导致正确的重新布局。我更喜欢显示/隐藏(而不是删除和重新新建),因为这肯定更容易实现、更高效且不易出错。

我采用了旧的示例代码并添加了一个工具按钮,可用于切换一些布局小部件的可见性:

// Qt header:
#include <QtWidgets>

class LabelImage: public QLabel {

private:
QPixmap _qPixmap, _qPixmapScaled;

public:
void setPixmap(const QPixmap &qPixmap) { setPixmap(qPixmap, size()); }

protected:
virtual void resizeEvent(QResizeEvent *pQEvent);

private:
void setPixmap(const QPixmap &qPixmap, const QSize &size);
};

void LabelImage::resizeEvent(QResizeEvent *pQEvent)
{
QLabel::resizeEvent(pQEvent);
setPixmap(_qPixmap, pQEvent->size());
}

void LabelImage::setPixmap(const QPixmap &qPixmap, const QSize &size)
{
_qPixmap = qPixmap;
_qPixmapScaled = _qPixmap.scaled(size, Qt::KeepAspectRatio);
QLabel::setPixmap(_qPixmapScaled);
}

int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
// main application
QApplication app(argc, argv);
// setup GUI
QMainWindow qWin;
QToolBar qToolbar;
QAction qCmdTgl(QString::fromUtf8("Decoration"));
qCmdTgl.setCheckable(true);
qCmdTgl.setChecked(true);
qToolbar.addAction(&qCmdTgl);
qWin.addToolBar(&qToolbar);
QGroupBox qBox;
QGridLayout qGrid;
// a macro for the keyboard lazy:
#define Q_LBL_WITH_POS(ROW, COL) \
QLabel qLbl##ROW##COL(QString::fromLatin1(#ROW", "#COL)); \
/*qLbl##ROW##COL.setFrameStyle(QLabel::Raised | QLabel::Box);*/ \
qGrid.addWidget(&qLbl##ROW##COL, ROW, COL, Qt::AlignCenter)
Q_LBL_WITH_POS(0, 0);
Q_LBL_WITH_POS(0, 1);
Q_LBL_WITH_POS(0, 2);
Q_LBL_WITH_POS(1, 0);
LabelImage qLblImg;
qLblImg.setFrameStyle(QLabel::Raised | QLabel::Box);
qLblImg.setAlignment(Qt::AlignCenter);
//qLblImg.setMinimumSize(QSize(1, 1)); // seems to be not necessary
qLblImg.setSizePolicy(
QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
QPixmap qPM;
if (qPM.load("cats.jpg")) qLblImg.setPixmap(qPM);
else {
qLblImg.setText(
QString::fromLatin1("Sorry. Cannot find file 'cats.jpg'."));
}
qGrid.addWidget(&qLblImg, 1, 1, Qt::AlignCenter);
qGrid.setRowStretch(1, 1); // tell QGridLayout to stretch this cell...
qGrid.setColumnStretch(1, 1); // ...prior to other cells (w/ stretch 0)
Q_LBL_WITH_POS(1, 2);
Q_LBL_WITH_POS(2, 0);
Q_LBL_WITH_POS(2, 1);
Q_LBL_WITH_POS(2, 2);
qBox.setLayout(&qGrid);
qWin.setCentralWidget(&qBox);
qWin.show();
// install signal handlers
QObject::connect(&qCmdTgl, &QAction::triggered,
[&](bool on) {
qLbl00.setVisible(on); qLbl01.setVisible(on); qLbl02.setVisible(on);
qLbl10.setVisible(on); qLbl12.setVisible(on);
qLbl20.setVisible(on); qLbl21.setVisible(on); qLbl22.setVisible(on);
});
// run application
return app.exec();
}

我在 Windows 10 上的 VS2013 中编译和测试:

Snapshot of testQLabelImageResize – initial state

切换装饰工具按钮后:

Snapshot of testQLabelImageResize – with hidden widgets

注意:

出于好奇,我评论了更改框架样式的行

qLblImg.setFrameStyle(QLabel::Raised | QLabel::Box);

再一次,调整图像大小不再正常工作。

关于c++ - qt 删除布局代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48869200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com