Qt中QTabWidget添加控件(按钮,label等)以及使用方法

Posted ZLJ_Nice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中QTabWidget添加控件(按钮,label等)以及使用方法相关的知识,希望对你有一定的参考价值。

今天遇到了一个问题,已经在QTabWidget每一行添加了一个按钮,我有一个需求就是,点击每一行的按钮都有各自的响应

首先说一下添加控件代码:

添加文字可以用setItem,添加控件就得用setCellWidget了。

self.checkButton = QtWidgets.QPushButton(\'查看\')
self.abnor_act_rec_table.setCellWidget(i, 4, self.checkButton)      

我的QTabWidget的表名是abnor_act_rec_tablei表示表格的第i行。

现在我想要每一行的checkButton都得有自己对应的响应,我肯定先要获得每一行的按钮,通过搜索后可以使用cellWidget方法获得,响应又需要槽函数,所以代码如下:

self.abnor_act_rec_table.cellWidget(i, 4).clicked.connect(self.checkPic)

槽函数是checkPic

然后问题就来了,槽函数怎么知道是我点击的哪个按钮呢,我尝试给checkPic加一个参数,然后emit一个数字,发现发送的全是TrueFalse,这是因为clicked只有TrueFalse两个值。

然后,然后,我乱七八糟的搜索了解到了sender(), 这玩意就用于判断是什么信号给槽发送了信号,于是我在槽函数checkPic中打印了以下self.sender(),发现点击不同按钮打印的是按钮对象以及在内存中的地址,类似<PyQt5.QtWidgets.QPushButton object at 0x000001DDE6F54160>这种东西,确实是分辨出来了,但是我没法用啊,我想知道是哪一行的按钮。

然后我又偶然想到了前几天看代码的一个东西叫做setObjectName(),那么sender()既然是一个对象,那它肯定有个名字,搜了以下可以用objectName()函数获得,因此就解决了,可以用setObjectName()给每个按钮自定义一个名字啊,我给它的名字就是行号,代码如下:

self.checkButton.setObjectName(\'btn\'.format(id))

然后在槽函数checkPic中可以直接利用self.sender().objectName()知道是哪一行的按钮发来的信号了。

sender还有很多作用,比如还可以判断是什么对象发来的信号。

QTabWidget 中的标签文本对齐

【中文标题】QTabWidget 中的标签文本对齐【英文标题】:Tab text alignment in QTabWidget 【发布时间】:2015-12-03 12:32:31 【问题描述】:

我正在使用 Qt 的 QTabWidget 类。 在 TabWidget 中,我动态添加新选项卡并将 TextElideMode 设置为右侧以在 tabBar 中显示工具按钮。

tabWidget = new QTabWidget(this);
m_addNewTab = new QWidget(tabWidget);
m_addNewGridLayout = new QGridLayout(m_addNewTab);
m_addNewWebView = new MyWebView(m_addNewTab);
widget = new QWidget(m_addNewTab);
tb = new QToolButton(widget);
tb->setFixedHeight(20);
tb->setText("<");
tb1 = new QToolButton(widget);
tb1->setFixedHeight(20);
tb1->setText(">");

m_horizontalLayout = new QHBoxLayout(widget);
m_horizontalLayout->addWidget(tb);
m_horizontalLayout->addWidget(tb1);

有关示例应用程序的输出,请参阅下面的屏幕截图。 选择当前选项卡时,ToolButton都应该显示和文本ELIDE模式应该是正确的,但是当没有选择选项卡时,应不会显示ToolButton,但应留下文本ELINE模式。

在下面的屏幕截图中,我可以根据选项卡选择隐藏和显示工具按钮,但是当未选择选项卡时,文本省略模式设置为正确,因此我们能够看到不必要的空间(检查最后一个选项卡)。设置文本省略模式左侧也不起作用,因为我们已经在左侧设置了工具按钮。

当没有选择标签时,有人可以指导我如何删除空格(屏幕截图中的最后一个标签)吗?

【问题讨论】:

如果 QToolButtons 隐藏它们也应该折叠并且不再使用任何空间..你如何隐藏它们?请提供一个完整的最小工作链接示例。 为了隐藏工具按钮,我只是在迭代父对象,一旦我得到工具按钮对象,它将被下面的语句隐藏。 tb->hide(); 【参考方案1】:

你必须:

    跟踪标签索引和相应的持有小部件(比如说std::map&lt;int,QToolButton&gt; toolbutton_by_index 发出QTabWidget.currentChanged 时,停用除所选小部件之外的所有小部件

你可以这样做第二部分:

std::for_each(toolbutton_by_index.begin(), toolbutton_by_index.end(),
        [&index](auto pair)
            (pair.first == index)?pair.second->hide():pair.second->show());

【讨论】:

这会很有帮助,但我不想使用地图。我想从父对象和我想隐藏的工具按钮对象中找到子对象。 在这种情况下,您需要遍历对应的children,方法是遵循父子关系并使用qobject_cast 测试/转换它们为/到QToolButton 感谢您的回复。我试图遍历孩子,但上面的代码只将“MyWebView”对象作为孩子。我无法获得 QToolButton 孩子。 你只是在尝试***孩子。也可以使用m_addNewTab-&gt;findChild&lt;QToolButton *&gt;(),不过不知道有没有性能问题。

以上是关于Qt中QTabWidget添加控件(按钮,label等)以及使用方法的主要内容,如果未能解决你的问题,请参考以下文章

关于QT的系统总结

在 Qt 中,如何通过 qss 自定义如下 QTabWidget?

在 Qt 中创建选项卡

Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)

Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)

Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)