【发布时间】:2014-01-17 21:56:11
【问题描述】:
我想在主窗口中单击按钮时动态创建一个新选项卡。让这个按钮成为新的。我在主窗口中放置了一个QWidget,我希望QTabWidget 可见。我添加了一个名为 TabWidget (QTabWidget) 的新表单,其中包含我的第一页设计。
我这样做了:
page1 = new TabWidget(ui->widget); // TabWidget inherits QTabWidget
this->centralWidget()->layout()->addWidget(page1);
在我的QWidget 中获得了第一页。这样就完成了。
我尝试使用BACK 和NEXT 按钮实现从一个选项卡到另一个选项卡的遍历。
我在一个小部件(名为 form2)而不是 QTabWidget 中设计了第二个选项卡,我从我的第一个选项卡中调用了这个表单:
page2 = new Form2(); // Form2 contains the tab2 design
TabWidget::addTab(page2,"Scalar Parameters"); // Only this works, I couldn't use objects
TabWidget::setCurrentWidget(page2);
问题来了:
我不能对第三个标签做同样的事情。
page3 = new Form3(); // Form3 contains the tab3 design
TabWidget *t= new TabWidget();
t->addTab(page3,"Table Parameters");
t->setCurrentWidget(page3);
我在这里错过了什么?
我有这些文件,
大型机.h,
tabwidget.h (inherits QTabWidget) 这也是我的第一个标签,
tabwidget2.h(继承QWidget)第二个标签,
tabwidget3.h(继承QWidget)第三个标签。
我在 mainframe.h 中包含了 tabwidget.h 并为它创建了一个对象 page1。因此,当在大型机上单击按钮时,我会这样做,
TabWidget *page1 = new TabWidget();
this->centralWidget()->layout()->addWidget(page1);
这会在大型机上创建一个包含我的设计的选项卡。这完美地工作。然后我在这个标签page1中有一个NEXT按钮。所以当我点击它时,我想在这个page1中添加一个新的标签page2。为此,我在 tabwidget.h 中包含了 tabwidget2.h 并创建了一个对象 page2。现在,当在我的 page1 中单击一个按钮时,我会这样做,
tabwidget2 *page2 = new tabwidget2();
tabwidget *t= new tabwidget();
t->addTab(page2,"Scalar Parameters");
t->setCurrentWidget(page2);
但这不起作用。所以我这样做了,
tabwidget2 *page2 = new tabwidget2(t);
tabwidget::addTab(page2,"Scalar Parameters");
tabwidget::setCurrentWidget(page2);
这很有效,我将第二页添加到了我的第一个标签中。当我从第 2 页单击“下一步”按钮时添加第 3 页时出现问题。我这样做了,
tabwidget3 *page3 = new tabwidget3();
tabWidget *t= new tabWidget();
t->addTab(page3,"Table Parameters");
t->setCurrentWidget(page3);
并没有工作。程序编译没有任何错误。
大型机 ->(新按钮)-> page1(这是一个QTabWidget 显示在大型机上的小部件上)->(NEXT 按钮)-> page2(QWidget 作为新选项卡添加到 page1)->(NEXT 按钮) -> 什么都没发生
我已尽力解释这一点。请帮帮我。
代码: mainframe.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "tabwidget.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
TabWidget *page1;
~MainWindow();
private slots:
void on_action_About_triggered();
void on_action_New_triggered();
private:
Ui::MainWindow *ui;
};
Tabwidget.h
#ifndef TABWIDGET_H
#define TABWIDGET_H
#include <QTabWidget>
#include "tabwidget2.h"
namespace Ui {
class TabWidget;
}
class TabWidget : public QTabWidget
{
Q_OBJECT
public:
explicit TabWidget(QWidget *parent = 0);
~TabWidget();
tabwidget2 *page2;
private slots:
void on_pushButton_6_clicked();
private:
Ui::TabWidget *ui;
};
#endif // TABWIDGET_H
tabwidget2.h
#ifndef TABWIDGET2_H
#define TABWIDGET2_H
#include <QWidget>
#include "tabwidget3.h"
namespace Ui {
class tabwidget2;
}
class tabwidget2 : public QWidget
{
Q_OBJECT
public:
explicit tabwidget2(QWidget *parent = 0);
~tabwidget2();
tabwidget3 *page3;
private slots:
void on_pushButton_2_clicked();
private:
Ui::tabwidget2 *ui;
};
#endif // TABWIDGET2_H
mainframe.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtWidgets"
#include "qtabwidget.h"
#include "qdialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_action_New_triggered()
{
TabWidget *page1 = new TabWidget();
this->centralWidget()->layout()->addWidget(page1);
}
tabwidget.cpp
#include "tabwidget.h"
#include "ui_tabwidget.h"
TabWidget::TabWidget(QWidget *parent) :
QTabWidget(parent),
ui(new Ui::TabWidget)
{
ui->setupUi(this);
}
TabWidget::~TabWidget()
{
delete ui;
}
void TabWidget::on_pushButton_6_clicked()
{
tabwidget2 *page2 = new tabwidget2();
this->addTab(page2,"Scalar Parameters");
this->setCurrentWidget(page2);
}
tabwidget2.cpp
#include "tabwidget2.h"
#include "ui_tabwidget2.h"
#include "tabwidget.h"
tabwidget2::tabwidget2(QWidget *parent) :
QWidget(parent),
ui(new Ui::tabwidget2)
{
ui->setupUi(this);
}
tabwidget2::~tabwidget2()
{
delete ui;
}
void tabwidget2::on_pushButton_2_clicked()
{
tabwidget3 *page3 = new tabwidget3();
TabWidget *t= new TabWidget();
t->addTab(page3,"Table Parameters");
t->setCurrentWidget(page3);
}
我只是无法导入我的第 3 页。
【问题讨论】:
-
TabWidget类是什么?它是在QTabWidget之后继承的吗?addTab和setCurrentWidget也不是静态方法。 -
是的,TabWidget 继承了 QTabWidget。你能给我示例代码吗?
-
查看您的
TabWidget::addTab调用,您似乎在那里创建了一个静态方法(如果它编译的话)。这似乎很错误......如果它可以做任何有意义的事情,那么您的数据成员必须是静态的,这也是非常糟糕的设计(尽管只要您只有其中一个就可以工作)。请多研究 C++ OOP 的静态与非静态成员(方法和变量)。 -
我上面所说的另一种说法是,要在 Qt/C++ 中编码,您需要先学习 C++(除非您不需要需要异常,或者自己创建模板,或任何
std的东西,如std::string或std::cout)。在不了解静态与非静态方法这样基本的东西的情况下跳入 Qt 小部件编程将是……痛苦的。 -
我认为我没有在任何地方使用过静态成员。我已经发布了我的代码。
标签: qt dynamic tabs qtabwidget