如何使用 QPushButton 在现有 QTabWidget 上添加“新选项卡”

Posted

技术标签:

【中文标题】如何使用 QPushButton 在现有 QTabWidget 上添加“新选项卡”【英文标题】:How to add a "new tab" on an existing QTabWidget using a QPushButton 【发布时间】:2020-05-17 17:17:47 【问题描述】:

我正在尝试使用QPushButton 在现有QTabWidget 上添加一个“新标签”,如下所示:

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

在最小可验证示例下方:

ma​​inwindow.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;
;

ma​​inwindow.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>

我尝试通过多种方式解决问题,并研究了可能的原因。我遇到了几个参考资料,例如 this one、this 和 this one,但它们都没有帮助完全解决问题。

我确信currentChanged 的属性是正确的,但是尽管终端中没有错误,但触发按钮的回调并没有起作用。

我错过了什么?感谢您指出解决此问题的正确方向。

【问题讨论】:

【参考方案1】:

connect 按钮的clicked 信号到tabwidget 的addTab 函数/槽(或在正确的目标对象上调用addTab 的中间函数/lambda)。

例如:

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

或者类似的东西。

【讨论】:

您好,感谢您阅读问题:)。您能否将您的答案与代码集成在一起? 如果这就是你的意思connect(ui-&gt;tabWidget, &amp;QTabWidget::addTab, this, &amp;MainWindow::on_addTabBtn_clicked); 它不工作,它说no matching member function for call to connect Ooooo 好的,我知道您的意思。感谢您更新答案。它工作正常 :) 感谢您的宝贵时间!

以上是关于如何使用 QPushButton 在现有 QTabWidget 上添加“新选项卡”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QPalette 自定义 Qpushbutton 上的文本?

Qt:如何在 qpushbutton 中创建超链接?

鼠标在圆角QPushButton时如何不触发悬停状态?

如何在 Qt 应用程序中使用样式表更改 QPushButton 图标

如何在PyQt5中使用QDrag拖动时显示QPushButton?

如何在 PyQt5 中制作自定义 QPushButton?