如何使用QPushButton在现有的QTabWidget上添加一个 "新标签"。

问题描述 投票:0回答:1

我试图在一个现有的 "新标签 "上添加一个 "新标签"。QTabWidget 使用 QPushButton 如下图所示。

tab

问题是 我的问题是,当我按下按钮时,什么都没有发生,也没有添加 "新标签"。我设置了所有正确的连接和插槽,但有些东西阻止我把它添加到 "新标签"。QTabWidget. 基本上在我按下按钮的时候什么都没有发生。

下面是最小的可验证的例子。

mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void newTab();

private slots:
    void on_addTabBtn_clicked();

private:
    Ui::MainWindow *ui;
};

mainwindow.cpp

#include <QLabel>
#include <QTabBar>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->clear();
    ui->tabWidget->addTab(new QLabel("+"), QString("+"));
    connect(ui->tabWidget, &QTabWidget::currentChanged, this, &MainWindow::on_addTabBtn_clicked);
    newTab();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::newTab()
{
    int position = ui->tabWidget->count() - 1;
    ui->tabWidget->insertTab(position, new QLabel("Insert New Tab"), QString("New Tab"));
    ui->tabWidget->setCurrentIndex(position);
    auto tabBar = ui->tabWidget->tabBar();
    tabBar->scroll(tabBar->width(), 0);
}


void MainWindow::on_addTabBtn_clicked()
{
    int index = 0;
    if(index == this->ui->tabWidget->count() - 1) {
        newTab();
    }
}

如果你也想看看简单的...。.ui 文件见下文。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>428</width>
    <height>279</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QTabWidget" name="tabWidget">
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>Tab 1</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tab_2">
       <attribute name="title">
        <string>Tab 2</string>
       </attribute>
      </widget>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QPushButton" name="addTabBtn">
      <property name="text">
       <string>Add Tab</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>428</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

我尝试用很多方法来解决这个问题,并研究了可能的原因。我看到了一些参考资料,如 这个, 这个这个 但都没有帮助彻底解决这个问题。

我相信 当前已更改 是正确的,但是触发按钮的回调并没有完成工作,尽管终端中没有任何错误。

我到底遗漏了什么?谢谢你指出解决这个问题的正确方向。

c++ qt qt5 qtablewidget qpushbutton
1个回答
1
投票

connectclicked 钮的信号给 addTab 的functionslot(或调用中间函数lambda)。addTab 在正确的目标对象上)。)

比如说。

connect(ui->addTabBtn, &QPushButton::clicked, this, [&] { ui->tabWidget->addTab(new QLabel("+"), QString("+")); });

或者类似这样的东西。

© www.soinside.com 2019 - 2024. All rights reserved.