Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 我怎样才能加上一句;新标签";在选项卡式视图模式下,QMdiArea选项卡旁边的按钮?_Qt_Tabs_Qtabwidget_Qmdiarea - Fatal编程技术网

Qt 我怎样才能加上一句;新标签";在选项卡式视图模式下,QMdiArea选项卡旁边的按钮?

Qt 我怎样才能加上一句;新标签";在选项卡式视图模式下,QMdiArea选项卡旁边的按钮?,qt,tabs,qtabwidget,qmdiarea,Qt,Tabs,Qtabwidget,Qmdiarea,我想要一个“新标签”按钮,就像Chrome或Firefox为我的QMdiArea所做的那样 我可以在某个地方制作一个按钮或菜单项,将一个新的子文档添加到MDI中,但是我如何才能使它成为一个带有“+”标签的具有视觉吸引力的小选项卡呢?或者,我很乐意使用带有这样一个按钮的QTabWidget。您必须为qtabar编写自己的类。可以使用绝对定位添加加号按钮 我这里有一些PySide的代码;它应该给你一个基本的想法 类TabBarPlus(QtGui.QTabBar): “”“在选项卡右侧浮动加号按钮的

我想要一个“新标签”按钮,就像Chrome或Firefox为我的
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)这很好。你能告诉我一些我可以用你的方法面对的问题吗?就像任何调整大小的问题一样