如何在 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】:谢谢你们,你们帮了我很多。这就是我所做的。
mainwindow.h:添加了一个槽
private slots:
void onTabBarClicked(int);
mainwindow.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 中动态更改标签大小?的主要内容,如果未能解决你的问题,请参考以下文章