首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QWidget连接到槽QStackedWidget::setCurrentWidget

将QWidget连接到槽QStackedWidget::setCurrentWidget
EN

Stack Overflow用户
提问于 2013-09-10 14:08:40
回答 2查看 1.7K关注 0票数 0

我正在尝试切换堆叠按钮,如下面的应用程序所示。

声明:

代码语言:javascript
复制
#include <QPushButton>
#include <QMainWindow>
#include <QStackedWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
   QPushButton* m_button[2];
   QStackedWidget *m_buttonStack;
};

执行(注意到连接):

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    resize(300, 300);

    m_buttonStack = new QStackedWidget( this );
    m_buttonStack->setGeometry( 100, 100 , 100 , 100 );

    m_button[0] = new QPushButton( this );
    m_button[0]->setText( "Button 1" );
    m_buttonStack->addWidget( m_button[0] );

    m_button[1] = new QPushButton( this );
    m_button[1]->setText( "Button 2" );
    m_buttonStack->addWidget( m_button[1] );

    m_buttonStack->setCurrentWidget( m_button[1] );

    QObject::connect( m_button[0] , SIGNAL( clicked() ) , m_buttonStack , SLOT( setCurrentWidget( m_button[1] ) ) );
    QObject::connect( m_button[1] , SIGNAL( clicked() ) , m_buttonStack , SLOT( setCurrentWidget( m_button[0] ) ) );
}

由于一些令人费解的原因,尽管QStackedWidget::setCurrentWidget被定义为QObject::connect无法连接到它,但从应用程序输出窗口复制的下列错误消息显示:

代码语言:javascript
复制
Object::connect: No such slot QStackedWidget::setCurrentWidget( m_button[1] ) in ..\mainwindow.cpp:21
Object::connect: No such slot QStackedWidget::setCurrentWidget( m_button[0] ) in ..\mainwindow.cpp:22
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 14:17:26

你会想要使用QSignalMapper

代码语言:javascript
复制
connect(m_button[0], SIGNAL(clicked()), m_signalMapper, SLOT(map()));
m_signalMapper->setMapping(m_button[0],m_button[1]);
connect(m_button[1], SIGNAL(clicked()), m_signalMapper, SLOT(map()));
m_signalMapper->setMapping(m_button[1],m_button[0]);

QObject::connect(signalMapper , SIGNAL( mapped(QWidget *) ) , m_buttonStack , SLOT( setCurrentWidget(QWidget *) ) );
票数 2
EN

Stack Overflow用户

发布于 2013-09-10 14:12:34

当引用槽宏中的函数签名时,不需要提供实际的参数:

代码语言:javascript
复制
QObject::connect( m_button[0], SIGNAL( clicked() ), m_buttonStack, SLOT( setCurrentWidget( m_button[1] ) ) );

应该是这样的:

代码语言:javascript
复制
QObject::connect( m_button[0], SIGNAL( clicked() ), m_buttonStack, SLOT( setCurrentWidget( QWidget *) ) );

正如您所看到的,即使以这种方式,连接也将无法工作。我建议实现您自己的插槽(没有参数),并将您的按钮单击连接到它:

代码语言:javascript
复制
QObject::connect(m_button[0], SIGNAL(clicked()), this, SLOT(onButtonClicked()));

在插槽中,您可以处理单击:

代码语言:javascript
复制
void MainWindow::onButtonClicked()
{
    // Get the button clicked
    QPushButton *btn = qobject_cast<QPushButton *>(sender());
    m_buttonStack->setCurrentWidget(btn);
}

因此,您甚至可以删除按钮数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18721191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档