C++ 创建非常相似的选项卡

C++ 创建非常相似的选项卡,c++,qt,C++,Qt,编辑1:better title他们实现的任务似乎是多余的,因为我看到,您使用的不是两个单独的小部件添加两个选项卡,而是一个QStackedWidget,也就是说,在视觉上它是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用QListView而不是QListWidget,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用

编辑1:better title

他们实现的任务似乎是多余的,因为我看到,您使用的不是两个单独的小部件添加两个选项卡,而是一个QStackedWidget,也就是说,在视觉上它是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用
QListView
而不是
QListWidget
,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用代理模型为每个视图获得不同的排序和筛选行为。@eyllanesc我不确定是否理解您的问题。这个例子只是保留了我最初的想法,即使用QTabBar和QStackedWidget而不是QTabWidget来控制切换行为。如果编译并运行该示例,您将看到,如果单击选项卡1-3和选项卡4上的QPushButtons,左侧和右侧的实现都会切换到QListWidgets。两侧实现相同,但:-左侧相当复杂的连接/断开连接,空窗口小部件-右侧ugly@ekhumoro这是一个很好的建议,我会研究的!这将使我复杂的尝试过时,我只需在每个选项卡上添加必要的视图,并在模型中执行工作。他们实现的任务似乎是多余的,因为我看到,您使用的是QStackedWidget,而不是使用两个单独的小部件添加两个选项卡,也就是说,视觉上是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用
QListView
而不是
QListWidget
,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用代理模型为每个视图获得不同的排序和筛选行为。@eyllanesc我不确定是否理解您的问题。这个例子只是保留了我最初的想法,即使用QTabBar和QStackedWidget而不是QTabWidget来控制切换行为。如果编译并运行该示例,您将看到,如果单击选项卡1-3和选项卡4上的QPushButtons,左侧和右侧的实现都会切换到QListWidgets。两侧实现相同,但:-左侧相当复杂的连接/断开连接,空窗口小部件-右侧ugly@ekhumoro这是一个很好的建议,我会研究的!这将使我复杂的尝试过时,我只需在每个选项卡上添加必要的视图,并在模型中进行工作。
#include <QApplication>

#include "mainwindow.h"    

int main(int argc, char **argv)
{        
    QApplication app(argc, argv);
    MainWindow mw;
    mw.show();
    return app.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTabBar>
#include <QTabWidget>
#include <QStackedWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    // constructor
    explicit MainWindow(QWidget *parent = 0);

private:
    void switchTab1(int index);
    void switchTab2(int index);
    QTabWidget *tabwidget1_;
    QTabBar *tabwidget2_;
    QStackedWidget *stack1_;
    QStackedWidget *stack2_;

};

#endif // MAINWINDOW_H
#include <QListWidget>
#include <QPushButton>
#include <QLayout>

#include "mainwindow.h"

// constructor
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{    
    //LEFT
    QWidget *listTab1 = new QWidget;
    QVBoxLayout *listTab1Layout = new QVBoxLayout;
    listTab1Layout->addWidget(new QListWidget);
    listTab1Layout->addWidget(new QListWidget);
    listTab1->setLayout(listTab1Layout);

    QWidget *buttonTab1 = new QWidget;
    QVBoxLayout *buttonTab1Layout = new QVBoxLayout;
    buttonTab1Layout->addWidget(new QPushButton);
    buttonTab1Layout->addWidget(new QPushButton);
    buttonTab1Layout->addStretch();
    buttonTab1->setLayout(buttonTab1Layout);

    tabwidget1_ = new QTabWidget;
    tabwidget1_->addTab(listTab1,"tab1");
    tabwidget1_->addTab(new QWidget,"tab2");
    tabwidget1_->addTab(new QWidget,"tab3");
    tabwidget1_->addTab(buttonTab1,"tab4");

    // extracts the stacked widget, parentWidget() returns QObject,
    // so it needs to be casted to QStackedWidget
    stack1_ = qobject_cast<QStackedWidget*>(tabwidget1_->widget(0)->parentWidget());
    // extract the tabbar
    QTabBar *tabbar = tabwidget1_->tabBar();
    // disconnects the switching of tabs, so I can implement my own function
    disconnect(tabbar,&QTabBar::currentChanged,0,0);
    // reconnect to manipulate the switching
    connect(tabbar,&QTabBar::currentChanged,this,&MainWindow::switchTab1);

    // RIGHT
    QWidget *listTab2 = new QWidget;
    QVBoxLayout *listTab2Layout = new QVBoxLayout;
    listTab2Layout->addWidget(new QListWidget);
    listTab2Layout->addWidget(new QListWidget);
    listTab2->setLayout(listTab2Layout);

    QWidget *buttonTab2 = new QWidget;
    QVBoxLayout *buttonTab2Layout = new QVBoxLayout;
    buttonTab2Layout->addWidget(new QPushButton);
    buttonTab2Layout->addWidget(new QPushButton);
    buttonTab2Layout->addStretch();
    buttonTab2->setLayout(buttonTab2Layout);

    tabwidget2_ = new QTabBar;
    tabwidget2_->addTab("tab1");
    tabwidget2_->addTab("tab2");
    tabwidget2_->addTab("tab3");
    tabwidget2_->addTab("tab4");

    stack2_ = new QStackedWidget;

    stack2_->addWidget(listTab2);
    stack2_->addWidget(buttonTab2);
    connect(tabwidget2_,&QTabBar::currentChanged,this,&MainWindow::switchTab2);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(tabwidget2_);
    rightLayout->addWidget(stack2_);

    // ADD TO MAIN
    QWidget *mainWidget = new QWidget;
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(tabwidget1_);
    mainLayout->addLayout(rightLayout);
    mainWidget->setLayout(mainLayout);
    setCentralWidget(mainWidget);
}

void MainWindow::switchTab1(int index)
{
    //    stack_->setCurrentIndex(index);
    //    return;
    switch (index) {
    case 0:
    case 1:
    case 2:
        stack1_->setCurrentIndex(0);
        break;
    case 3:
        stack1_->setCurrentIndex(3);
        break;
    }
    emit tabwidget1_->currentChanged(index);
}

void MainWindow::switchTab2(int index)
{
    //    stack_->setCurrentIndex(index);
    //    return;
    switch (index) {
    case 0:
    case 1:
    case 2:
        stack2_->setCurrentIndex(0);
        break;
    case 3:
        stack2_->setCurrentIndex(1);
        break;
    }
}