【问题标题】:QSignalMapper doesn't work when connecting QAbstractButton::clicked to map()将 QAbstractButton::clicked 连接到 map() 时,QSignalMapper 不起作用
【发布时间】:2022-10-04 23:53:54
【问题描述】:

我想让MainWindow接收QToolButtons发出的信号,然后根据QToolButtons发出的索引在槽函数中做一些事情。当我编译项目时,没有发生错误。但是当我点击这些工具按钮时,什么也没发生,日志也没有被打印出来。我认为信号或槽有问题,但程序运行没有错误,所以我不知道如何找到解决方案。

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);
};

【问题讨论】:

  • QObject::connect(signalMapper, SIGNAL(map), this, SLOT(MainWindow::switchPage)); 这是错误的,您可以在运行时的输出和此函数的返回值中看到。为避免此类事情 - 使用 documentation 中正确描述的新信号槽语法。
  • 请始终包含一个最小的例如,请参阅minimal reproducible example

标签: c++ qt qt6


【解决方案1】:

看起来您连接到 QSignalMapper 的错误信号。由于您映射到一个整数,因此您想连接到QSignalMapper::mappedInt

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

此致, 罗伯特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2014-11-18
    • 2016-12-27
    • 2019-01-19
    相关资源
    最近更新 更多