如何在 Qt 中动态更改标签大小?

Posted

技术标签:

【中文标题】如何在 Qt 中动态更改标签大小?【英文标题】:How to dynamically change tabs sizes in Qt? 【发布时间】:2020-12-30 09:45:23 【问题描述】:

我是一名正在编写我的第一个 Qt 程序的学生,我需要一些帮助。我正在开发一个乐器模拟器。我有一个主窗口和 2 个类:DrumsWindow 和 KeysWindow 模拟鼓和键并具有不同的尺寸(鼓为 798x532,键为 953x306)。我在主窗口中创建了一个 tabWidget 并将我的 DrumsWindow 和 KeysWindow 插入其中:

ui->tabWidget->insertTab(0, &dw, "Drums");
ui->tabWidget->insertTab(1, &kw, "Synth");

if (ui->tabWidget->currentIndex() == 0)
    this->resize(798, 532);
    ui->tabWidget->resize(798, 532);


if (ui->tabWidget->currentIndex() == 1)
    this->resize(953, 306);
    ui->tabWidget->resize(953, 306);

此代码来自 MainWindow 构造函数。它有效,主窗口中有两个选项卡显示鼓和键。但是,那些“if”语句只会使第一个打开的选项卡具有适当的大小。当我单击 Synth 选项卡时,窗口大小保持不变(但我需要更改它)。所以,这就是我为解决问题而做的。首先,我在 MainWindow 类中创建了新插槽:

void MainWindow::drumsTabClicked()

    ui->tabWidget->setCurrentIndex(0);
    this->resize(798, 532);
    ui->tabWidget->resize(798, 532);

void MainWindow::keysTabClicked()

    ui->tabWidget->setCurrentIndex(1);
    this->resize(953, 306);
    ui->tabWidget->resize(953, 306);

然后,我将它们连接到信号:

connect(ui->tabWidget, SIGNAL(tabBarClicked(0)), this, SLOT(drumsTabClicked()));
connect(ui->tabWidget, SIGNAL(tabBarClicked(1)), this, SLOT(keysTabClicked()));

但是,它仍然不起作用。请您解释一下当用户单击选项卡时如何调整主窗口的大小?

【问题讨论】:

connect(ui->tabWidget, SIGNAL(tabBarClicked(0)), this, SLOT(drumsTabClicked()));这不是有效的连接语句。请阅读signals and slots。 离题但是...明确调整小部件的大小几乎总是错误的做法。除非你有充分的理由这样做,否则你应该让布局完成他们的工作。 你使用 Qt4 风格连接信号。太老了,不推荐了。自 Qt5 以来,有一种在编译时评估的新样式(与 Qt4 之前的运行时评估相反)。此外,您不再需要显式标记的插槽,但可以将每个可调用的内容与匹配的签名(包括 lambda)连接起来。仅供参考:New Signal Slot Syntax 我同意@G.M.关于窗口大小调整。我可以想象你有一个特定的想法,但试图在 Qt 中做到这一点是在与风车作斗争。相反,您应该尝试在网格(或框)中进行布局,其中网格单元大小由 Qt 本身在运行时(自动)确定。因此,您只需调整哪些单元格允许生长(以填充可用的额外空间),哪些不允许。最后,您(可能)会意识到这使布局和维护更容易。仅供参考:Layout Management 我知道“明确调整小部件的大小几乎总是错误的做法”,但我的程序是一个乐器模拟器,每个选项卡上都有一张乐器的照片。照片的大小是固定的,因此,为了避免裁剪,我需要更改窗口的几何形状。而且我无法应用任何布局,因为我需要每个按钮在照片上具有固定位置,以匹配它应该模拟的仪器部分。 【参考方案1】:

你应该像这样连接它:

connect(ui->tabWidget, SIGNAL(tabBarClicked(int)), this, SLOT(onTabBarClicked(int)));

然后在这个槽中做你的事情并用 if 分隔它们:

void MainWindow::tabBarClicked(int index)

    if(!index)
    
        this->resize(798, 532);
        ui->tabWidget->resize(798, 532);
    
    else
    
        this->resize(953, 306);
        ui->tabWidget->resize(953, 306);
    

您还可以通过右键单击 UI 表单标签栏并选择转到插槽 tabBarClicked 来自动创建此连接。

【讨论】:

【参考方案2】:

谢谢你们,你们帮了我很多。这就是我所做的。

ma​​inwindow.h:添加了一个槽

private slots:
    void onTabBarClicked(int);

ma​​inwindow.cpp:添加了slot的实现

void MainWindow::onTabBarClicked(int index)
    if (index == 0)
        this->resize(798, 532);
        ui->tabWidget->resize(798, 532);
    
    if (index == 1)
        this->resize(953, 306);
        ui->tabWidget->resize(953, 306);
    

并使用Qt5语法连接槽和信号:

connect(ui->tabWidget, &QTabWidget::tabBarClicked, this, &MainWindow::onTabBarClicked);

所以,现在可以了!

【讨论】:

以上是关于如何在 Qt 中动态更改标签大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何从动态 UITableView 单元格中获取 UILabel 的大小?

Qt 中如何改变Label大小

自动布局:窗口调整大小时如何更改框架的原点?

如何根据宽度有限的文本更改 UILabel 大小

如何根据标签文本快速更改表格视图单元格高度?

如何在 Kivy 中动态更改标签背景颜色