簡體   English   中英

將 QAbstractButton::clicked 連接到 map() 時,QSignalMapper 不起作用

[英]QSignalMapper doesn't work when connecting QAbstractButton::clicked to map()

我想讓MainWindow接收QToolButtons發出的信號,然后根據QToolButtons發送的索引在slot function中做一些事情。 當我編譯項目時,沒有發生錯誤。 但是當我點擊這些工具按鈕時,沒有任何反應,也沒有打印日志。 我認為信號或槽有問題,但程序運行沒有錯誤,所以我不知道如何找到解決方案。

MainWindow.cpp

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(MainWindowTitle);
    setWindowIcon(QIcon(":/res/icons/logo.ico"));

    signalMapper = new QSignalMapper(this);

    initLayout();
}

void MainWindow::initLayout()
{
    // initialize sidebar buttons
    initSideBar();

    // initialize QStackedWidget
    /* initialize CodePage */
    codePage = new CodePage(this);
    ui->stackedWidget->addWidget(codePage);
    ui->stackedWidget->setCurrentWidget(codePage);

    /* initialize Charts */
    qCharts = new ThemeWidget();
    ui->stackedWidget->addWidget(qCharts);
//    ui->stackedWidget->setCurrentWidget(qCharts);
}


void MainWindow::initSideBar()
{
    QStringList btn_bgImages;
    QStringList btn_names;
    btn_bgImages << ":res/sidebar/code.png" << ":res/sidebar/pencil.png" << ":res/sidebar/visualize.png" << ":res/sidebar/graph.png";
    btn_names << "Editor" << "Designer" << "Visualize" << "Charts";

    for(int i = 0; i < btn_bgImages.size(); i++)
    {
        cTabButton* ctBtn = new cTabButton(btn_bgImages.at(i));
        ctBtn->setText(btn_names.at(i));
        connect(ctBtn, SIGNAL(&QAbstractButton::clicked), signalMapper, SLOT(&QSignalMapper::map));
        signalMapper->setMapping(ctBtn, i);
        ui->sidebar->addWidget(ctBtn, 0, Qt::AlignTop);
    }
    QObject::connect(signalMapper, SIGNAL(map), this, SLOT(MainWindow::switchPage));
}


void MainWindow::switchPage(int index)
{
    qDebug() << "switchPage() triggered";
    switch(index)
    {
        case 0:
            qStackedWidget->setCurrentWidget(codePage);
            break;
        case 1:
            break;
        case 2:
            break;
        case 3:
            qStackedWidget->setCurrentWidget(qCharts);
            break;
        default:
            break;
    }
}


MainWindow.h

QT_BEGIN_NAMESPACE
namespace Ui
{
    class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget* parent = nullptr);

    ~MainWindow();

private slots:

    void switchPage(int);

private:

    Ui::MainWindow* ui;
    CodeEditor* configEditor;
    QListView* sidebar;
    QStackedWidget* qStackedWidget;
    CodePage* codePage;
    ThemeWidget* qCharts;
    QSignalMapper* signalMapper;

    void initSideBar();
    void initLayout();
};

cTabButton.h

class cTabButton : public QToolButton{

    Q_OBJECT

public:

    cTabButton(const QString& path, QWidget *parent=0);

     ~cTabButton();


protected:

    QString path;

    bool m_mousePressed;

    bool m_mouseHover;

    void doPaintStuff(int topColor, int centerColor, int bottomColor);

    void setButtonPressed(bool isPressed);

    void enterEvent(QEnterEvent *);

    void leaveEvent(QEvent *);

    void paintEvent(QPaintEvent *event);

    void mousePressEvent(QMouseEvent *event);
};

看起來您正在連接到錯誤的 QSignalMapper 信號。 由於您是 map 到 integer,因此您想要連接到QSignalMapper::mappedInt

QObject::connect(signalMapper, &QSignalMapper::mappedInt, this, &MainWindow::switchPage);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM