Qt 我怎样才能加上一句;新标签";在选项卡式视图模式下,QMdiArea选项卡旁边的按钮?
我想要一个“新标签”按钮,就像Chrome或Firefox为我的Qt 我怎样才能加上一句;新标签";在选项卡式视图模式下,QMdiArea选项卡旁边的按钮?,qt,tabs,qtabwidget,qmdiarea,Qt,Tabs,Qtabwidget,Qmdiarea,我想要一个“新标签”按钮,就像Chrome或Firefox为我的QMdiArea所做的那样 我可以在某个地方制作一个按钮或菜单项,将一个新的子文档添加到MDI中,但是我如何才能使它成为一个带有“+”标签的具有视觉吸引力的小选项卡呢?或者,我很乐意使用带有这样一个按钮的QTabWidget。您必须为qtabar编写自己的类。可以使用绝对定位添加加号按钮 我这里有一些PySide的代码;它应该给你一个基本的想法 类TabBarPlus(QtGui.QTabBar): “”“在选项卡右侧浮动加号按钮的
QMdiArea
所做的那样
我可以在某个地方制作一个按钮或菜单项,将一个新的子文档添加到MDI中,但是我如何才能使它成为一个带有“+”标签的具有视觉吸引力的小选项卡呢?或者,我很乐意使用带有这样一个按钮的
QTabWidget
。您必须为qtabar编写自己的类。可以使用绝对定位添加加号按钮
我这里有一些PySide的代码;它应该给你一个基本的想法
类TabBarPlus(QtGui.QTabBar):
“”“在选项卡右侧浮动加号按钮的选项卡栏。”“”
plusClicked=QtCore.Signal()
定义初始化(自):
super()。\uuuu init\uuuuu()
#加号按钮
self.plusButton=QtGui.QPushButton(“+”)
self.plusButton.setParent(self)
self.plusButton.setFixedSize(20,20)#小型固定尺寸
self.plusButton.clicked.connect(self.plusClicked.emit)
self.movePlusButton()#移动到正确的位置
#端构造函数
def sizeHint(自身):
“”“返回加号按钮宽度增加的选项卡栏大小。”“”
sizeHint=QtGui.qtabar.sizeHint(self)
宽度=sizeHint.width()
高度=sizeHint.height()
返回QtCore.QSize(宽度+25,高度)
#结束tabSizeHint
def resizeEvent(自我,事件):
“”“调整小部件的大小,并确保加号按钮位于正确的位置。”“”
super().resizeEvent(事件)
self.movePlusButton()
#结束调整大小事件
def表格布局更改(自我):
“”“每当选项卡布局更改时,都会调用此虚拟处理程序。”。
如果有任何变化,请确保加号按钮位于正确位置。
"""
super().tabLayoutChange()
self.movePlusButton()
#结束表格布局更改
def movePlusButton(自动)按钮:
“”“将加号按钮移动到正确的位置。”“”
#查找所有选项卡的宽度
size=sum([self.tabRect(i).width()表示范围内的i(self.count())]))
#大小=0
#对于范围内的i(self.count()):
#size+=self.tabRect(i).width()
#在可见区域设置加号按钮的位置
h=self.geometry().top()
w=自身宽度()
如果大小>w:#仅在滚动按钮的左侧显示
自加按钮移动(w-54,h)
其他:
self.plusButton.move(大小,h)
#结束移动按钮
#结束类MyClass
类CustomTabWidget(QtGui.QTabWidget):
“”“可以轻松添加新选项卡的选项卡小部件。”“”
定义初始化(自):
super()。\uuuu init\uuuuu()
#选项卡栏
self.tab=TabBarPlus()
self.setTabBar(self.tab)
#性质
self.setMovable(真)
self.setTabsClosable(真)
#信号
self.tab.plusClicked.connect(self.addTab)
self.tab.tabMoved.connect(self.moveTab)
self.tabCloseRequested.connect(self.removeTab)
#端构造函数
#端类CustomTabWidget
我知道这个问题已经过时,但不久前我正在寻找您所要求的功能的现成实现。我挖掘了一点,并为Qt5实现了这个-- 主要思想是:
// Create button what must be placed in tabs row
QToolButton *tb = new QToolButton();
tb->setText("+");
// Add empty, not enabled tab to tabWidget
tabWidget->addTab(new QLabel("Add tabs by pressing \"+\""), QString());
tabWidget->setTabEnabled(0, false);
// Add tab button to current tab. Button will be enabled, but tab -- not
tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, tb);
为什么不在QTabWidget的最后一个选项卡上创建一个按钮呢?只需创建最后一个带有“+”符号的选项卡,并使用currentChanged事件
class Trace_Tabs(QTabWidget):
def __init__(self):
QTabWidget.__init__(self)
self._build_tabs()
def _build_tabs(self):
self.setUpdatesEnabled(True)
self.insertTab(0,QWidget(), "Trace" )
self.insertTab(1,QWidget(),' + ')
self.currentChanged.connect(self._add_trace)
def _add_trace(self, index):
if index == self.count()-1 :
'''last tab was clicked. add tab'''
self.insertTab(index, QWidget(), "Trace %d" %(index+1))
self.setCurrentIndex(index)
if __name__ == '__main__':
app = QApplication([])
tabs = Trace_Tabs()
tabs.show()
app.exec_()
与@Garjy的回答类似的概念: 您可以使用“空白”选项卡,并在该选项卡上添加一个按钮。如果您使用的是
TabWidget.setTabsCloseable(True)
,这也将替换“关闭”按钮。可以将其设置为“空白”选项卡,因此我建议结合@Garjy的答案或添加一些文本/另一个新按钮
import sys
from qtpy.QtWidgets import QTabWidget, QWidget, QToolButton, QTabBar, QApplication
class Trace_Tabs(QTabWidget):
def __init__(self):
QTabWidget.__init__(self)
self.setTabsClosable(True)
self._build_tabs()
def _build_tabs(self):
self.insertTab(0, QWidget(), "Trace 0" )
# create the "new tab" tab with button
self.insertTab(1, QWidget(),'')
nb = self.new_btn = QToolButton()
nb.setText('+') # you could set an icon instead of text
nb.setAutoRaise(True)
nb.clicked.connect(self.new_tab)
self.tabBar().setTabButton(1, QTabBar.RightSide, nb)
def new_tab(self):
index = self.count() - 1
self.insertTab(index, QWidget(), "Trace %d" % index)
self.setCurrentIndex(index)
if __name__ == '__main__':
app = QApplication(sys.argv)
tabs = Trace_Tabs()
tabs.show()
app.exec_()
首先,向小部件添加一个空选项卡,并连接
currentChanged
信号:
TabsView::TabsView(QWidget *parent) :
QWidget(parent),
ui(new Ui::TabsView)
{
ui->setupUi(this);
ui->tabWidget->clear();
ui->tabWidget->addTab(new QLabel("+"), QString("+"));
connect(ui->tabWidget, &QTabWidget::currentChanged, this, &TabsView::onChangeTab);
newTab();
}
然后,在您的onChangeTab
插槽中,检查用户是否正在单击最后一个选项卡,然后调用newTab
:
void TabsView::onChangeTab(int index)
{
if (index == this->ui->tabWidget->count() - 1) {
newTab();
}
}
最后,在newTab
方法上,创建新选项卡并选择它:
void TabsView::newTab()
{
int position = ui->tabWidget->count() - 1;
ui->tabWidget->insertTab(position, new QLabel("Your new tab here"), QString("New tab"));
ui->tabWidget->setCurrentIndex(position);
auto tabBar = ui->tabWidget->tabBar();
tabBar->scroll(tabBar->width(), 0);
}
我不知道
QMdiArea
,但是QTabWidget
有一个有功能的。也许你应该检查一下?这在Qt5中非常有效,但对于Qt4,这给了我一个错误:错误:'QTabBar*QTabWidget::tabBar()const'受保护
,所以我想我只需要忘记Qt4就可以了!简单而优雅。原则上,我可以为QLabel使用任何图像,这是一个不错的优点。我已经检查并看到,真正的tabBar
在Qt4.8中受到保护。所以我在回答中加了“Qt5”。感谢您的评论。如果选项卡是可移动的(setMovable(true)),则可以在“新建选项卡”特殊栏后拖放选项卡,即使该栏已禁用:(。解决此问题的方法是使用:self.tabBar().setselectionbehaviornremove(QTabBar.SelectLeftTab)这很好。你能告诉我一些我可以用你的方法面对的问题吗?就像任何调整大小的问题一样