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_table
,i
表示表格的第i
行。
现在我想要每一行的checkButton
都得有自己对应的响应,我肯定先要获得每一行的按钮,通过搜索后可以使用cellWidget
方法获得,响应又需要槽函数,所以代码如下:
self.abnor_act_rec_table.cellWidget(i, 4).clicked.connect(self.checkPic)
槽函数是checkPic
。
然后问题就来了,槽函数怎么知道是我点击的哪个按钮呢,我尝试给checkPic
加一个参数,然后emit
一个数字,发现发送的全是True
和False
,这是因为clicked
只有True
和False
两个值。
然后,然后,我乱七八糟的搜索了解到了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<int,QToolButton> 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->findChild<QToolButton *>()
,不过不知道有没有性能问题。以上是关于Qt中QTabWidget添加控件(按钮,label等)以及使用方法的主要内容,如果未能解决你的问题,请参考以下文章
在 Qt 中,如何通过 qss 自定义如下 QTabWidget?
Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)
Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)
Python Qt GUI设计:QTabWidgetQStackedWidget和QDockWidget容器控件类(提升篇—2)