C++ 信号/插槽仅在少数对象中不工作

C++ 信号/插槽仅在少数对象中不工作,c++,qt,slots,qabstractbutton,qx11embedcontainer,C++,Qt,Slots,Qabstractbutton,Qx11embedcontainer,我想把一些抽象按钮的点击信号连接到同一个插槽。问题是,它只在一个抽象按钮上工作,当单击其他按钮时,什么也不会发生。你知道什么是失败的吗 我已经检查了信号和插槽之间的连接是否正确建立 我还尝试一次只连接一个按钮,以查看问题是否是将不同的按钮连接到同一插槽,但问题是它仅适用于特定的按钮(使用backroungLbl) //头 CIhm类:公共QWidget{ Q_对象 私人: CCamWindow类{ 公众: QAbstractButton*窗口; QAbstractButton*名称; CCamW

我想把一些抽象按钮的点击信号连接到同一个插槽。问题是,它只在一个抽象按钮上工作,当单击其他按钮时,什么也不会发生。你知道什么是失败的吗

我已经检查了信号和插槽之间的连接是否正确建立

我还尝试一次只连接一个按钮,以查看问题是否是将不同的按钮连接到同一插槽,但问题是它仅适用于特定的按钮(使用
backroungLbl

//头
CIhm类:公共QWidget{
Q_对象
私人:
CCamWindow类{
公众:
QAbstractButton*窗口;
QAbstractButton*名称;
CCamWindow(){
窗口=空;
name=NULL;
}
CCamWindow(QAbstractButton*w,QAbstractButton*i=NULL){
窗口=w;
name=i;
}
};
公众:
CIhm();
~CIhm();
私人:
标准::地图m_集装箱地图;
标准::地图m_控制地图;
私人:
空连接槽();
void CreateContainers();
公众时段:
void backgroundClicked();
};
#包括“ihm.h”
CIhm::CIhm(){
连接插槽();
CreateContainers();
ui.cam1mode4Lbl->hide();
ui.cam2mode4Lbl->hide();
ui.cam3mode4Lbl->hide();
ui.cam4mode4Lbl->hide();
ui.cam1mode4nameLbl->hide();
ui.cam2mode4nameLbl->hide();
ui.cam3mode4nameLbl->hide();
ui.cam4mode4nameLbl->hide();
ui.cam1mode1Lbl->hide();
ui.cam1mode1nameLbl->hide();
}
void CIhm::ConnectSlots(){
连接(ui.backgroundLbl,信号(clicked()),此,插槽(backgroundClicked());
连接(ui.cam1mode1Lbl,信号(单击()),此,插槽(backgroundClicked());
连接(ui.cam1mode2Lbl,信号(clicked()),此,插槽(backgroundClicked());
连接(ui.cam2mode2Lbl,信号(clicked()),此,插槽(backgroundClicked());
连接(ui.cam1mode4Lbl,信号(clicked()),此,插槽(backgroundClicked());
连接(ui.cam2mode4Lbl,信号(clicked()),此,插槽(backgroundClicked());
连接(ui.cam3mode4Lbl,信号(clicked()),此,插槽(backgroundCLicked());
连接(ui.cam4mode4Lbl,信号(clicked()),此,插槽(backgroundClicked());
}
void CIhm::CreateContainers(){
std::向量单容器;
单容器。推回(新的QX11EmbedContainer(此));
singleContainer[0]->setGeometry(ui.CAM1Model1BL->geometry().x(),ui.CAM1Model1BL->geometry().y(),ui.CAM1Model1BL->geometry().width()-1,ui.CAM1Model1BL->geometry().height()-1);
m_ControlMap[singleContainer[0]=CCamWindow(ui.cam1mode1Lbl,ui.cam1mode1nameLbl);
m_ContainerMap[1]=单个容器;
向量双容器;
双容器。推回(新的QX11EmbedContainer(此));
doubleContainer[0]->setGeometry(ui.cam1Model2bl->geometry().x(),ui.cam1Model2bl->geometry().y(),ui.cam1Model2bl->geometry().width()-1,ui.cam1Model2bl->geometry().height()-1);
m_ControlMap[doubleContainer[0]]=CCamWindow(ui.cam1mode2bl,ui.cam1mode2nameLbl);
双容器。推回(新的QX11EmbedContainer(此));
doubleContainer[1]->setGeometry(ui.cam2mode2Lbl->geometry().x(),ui.cam2mode2Lbl->geometry().y(),ui.cam2mode2Lbl->geometry().width()-1,ui.cam2mode2Lbl->geometry().height()-1);
m_ControlMap[doubleContainer[1]]=CCamWindow(ui.cam2mode2bl,ui.cam2mode2nameLbl);
m_ContainerMap[2]=双容器;
std::向量四元容器;
四容器。推回(新的QX11EmbedContainer(此));
quadContainer[0]->setGeometry(ui.cam1mode4Lbl->geometry().x(),ui.cam1mode4Lbl->geometry().y(),ui.cam1mode4Lbl->geometry().width()-1,ui.cam1mode4Lbl->geometry().height()-1);
m_ControlMap[quadContainer[0]=CCamWindow(ui.cam1mode4Lbl,ui.cam1mode4nameLbl);
四容器。推回(新的QX11EmbedContainer(此));
quadContainer[1]->setGeometry(ui.cam2mode4Lbl->geometry().x(),ui.cam2mode4Lbl->geometry().y(),ui.cam2mode4Lbl->geometry().width()-1,ui.cam2mode4Lbl->geometry().height()-1);
m_ControlMap[quadContainer[1]=CCamWindow(ui.cam2mode4Lbl,ui.cam2mode4nameLbl);
四容器。推回(新的QX11EmbedContainer(此));
quadContainer[2]->setGeometry(ui.cam3mode4Lbl->geometry().x(),ui.cam3mode4Lbl->geometry().y(),ui.cam3mode4Lbl->geometry().width()-1,ui.cam3mode4Lbl->geometry().height()-1);
m_ControlMap[quadContainer[2]=CCamWindow(ui.cam3mode4Lbl,ui.cam3mode4nameLbl);
四容器。推回(新的QX11EmbedContainer(此));
quadContainer[3]->setGeometry(ui.cam4mode4Lbl->geometry().x(),ui.cam4mode4Lbl->geometry().y(),ui.cam4mode4Lbl->geometry().width()-1,ui.cam4mode4Lbl->geometry().height()-1);
m_ControlMap[quadContainer[3]=CCamWindow(ui.cam4mode4Lbl,ui.cam4mode4nameLbl);
m_ContainerMap[4]=四集装箱;
}
void CIhm::backgroundClicked(){
printf(“背景\n”);
如果(ui.timePb->isVisible()){
hideTimeBar();
}否则{
showTimeBar();
}
}

这很奇怪…..您是如何做到的:检查信号和插槽之间的连接是否已正确建立。例如,使用CAM1Model1BL y did:const bool connected=connect(ui.CAM1Model1BL,信号(单击()),此,插槽(背景单击());然后我用WriteLog打印“已连接”(“连接已建立?=%d”,已连接);结果为1(真);什么是
camXmodeX
对象类型?@marpe我不相信你。无法实例化
QAbstractButton
,因为需要实现该方法(纯虚拟)。所以它甚至不会编译。所以你还有别的东西,
QPushButton
s也许。请给出一个最小且可重复的示例,因为您所展示的是有效的(假设您有一个适当的子类
QAbstractButton
)。@marpe
connect(ui.backgroundLbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam1mode1Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam1mode2Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam2mode2Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam1mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam2mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam3mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
connect(ui.cam4mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
void CIhm::backgroundClicked() {
    printf("background\n");
    if(ui.timePb->isVisible()){
        hideTimeBar();
    } else {
        showTimeBar();
    }
}
//Header
    class CIhm : public QWidget {
        Q_OBJECT
        private:
         class CCamWindow {
         public:
            QAbstractButton* window;
            QAbstractButton* name;

            CCamWindow(){
                window = NULL;
                name = NULL;
            }
            CCamWindow(QAbstractButton* w, QAbstractButton* i = NULL){
                window = w;
                name = i;
            }
         };

        public:
            CIhm();
            ~CIhm();

        private:
            std::map<int, std::vector<QX11EmbedContainer*> > m_ContainerMap;
            std::map<QX11EmbedContainer*, CCamWindow> m_ControlMap;

        private:
            void ConnectSlots();
            void CreateContainers();

        public slots:
            void backgroundClicked();

    };
#include "ihm.h"

CIhm::CIhm (){
    ConnectSlots();
    CreateContainers();

    ui.cam1mode4Lbl->hide();
    ui.cam2mode4Lbl->hide();
    ui.cam3mode4Lbl->hide();
    ui.cam4mode4Lbl->hide();
    ui.cam1mode4nameLbl->hide();
    ui.cam2mode4nameLbl->hide();
    ui.cam3mode4nameLbl->hide();
    ui.cam4mode4nameLbl->hide();
    ui.cam1mode1Lbl->hide();
    ui.cam1mode1nameLbl->hide();
}

void CIhm::ConnectSlots(){
    connect(ui.backgroundLbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam1mode1Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam1mode2Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam2mode2Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam1mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam2mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
    connect(ui.cam3mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundCLicked()));
    connect(ui.cam4mode4Lbl, SIGNAL(clicked()), this, SLOT(backgroundClicked()));
}

void CIhm::CreateContainers(){

    std::vector<QX11EmbedContainer*> singleContainer;
    singleContainer.push_back(new QX11EmbedContainer(this));
    singleContainer[0]->setGeometry(ui.cam1mode1Lbl->geometry().x(), ui.cam1mode1Lbl->geometry().y(), ui.cam1mode1Lbl->geometry().width()-1, ui.cam1mode1Lbl->geometry().height()-1);
    m_ControlMap[singleContainer[0]] = CCamWindow(ui.cam1mode1Lbl, ui.cam1mode1nameLbl);
    m_ContainerMap[1] = singleContainer;


    std::vector<QX11EmbedContainer*> doubleContainer;
    doubleContainer.push_back(new QX11EmbedContainer(this));
    doubleContainer[0]->setGeometry(ui.cam1mode2Lbl->geometry().x(), ui.cam1mode2Lbl->geometry().y(), ui.cam1mode2Lbl->geometry().width()-1, ui.cam1mode2Lbl->geometry().height()-1);
    m_ControlMap[doubleContainer[0]] = CCamWindow(ui.cam1mode2Lbl, ui.cam1mode2nameLbl);
    doubleContainer.push_back(new QX11EmbedContainer(this));
    doubleContainer[1]->setGeometry(ui.cam2mode2Lbl->geometry().x(), ui.cam2mode2Lbl->geometry().y(), ui.cam2mode2Lbl->geometry().width()-1, ui.cam2mode2Lbl->geometry().height()-1);
    m_ControlMap[doubleContainer[1]] = CCamWindow(ui.cam2mode2Lbl, ui.cam2mode2nameLbl);
    m_ContainerMap[2] = doubleContainer;


    std::vector<QX11EmbedContainer*> quadContainer;
    quadContainer.push_back(new QX11EmbedContainer(this));
    quadContainer[0]->setGeometry(ui.cam1mode4Lbl->geometry().x(), ui.cam1mode4Lbl->geometry().y(), ui.cam1mode4Lbl->geometry().width()-1, ui.cam1mode4Lbl->geometry().height()-1);
    m_ControlMap[quadContainer[0]] = CCamWindow(ui.cam1mode4Lbl, ui.cam1mode4nameLbl);
    quadContainer.push_back(new QX11EmbedContainer(this));
    quadContainer[1]->setGeometry(ui.cam2mode4Lbl->geometry().x(), ui.cam2mode4Lbl->geometry().y(), ui.cam2mode4Lbl->geometry().width()-1, ui.cam2mode4Lbl->geometry().height()-1);
    m_ControlMap[quadContainer[1]] = CCamWindow(ui.cam2mode4Lbl, ui.cam2mode4nameLbl);
    quadContainer.push_back(new QX11EmbedContainer(this));
    quadContainer[2]->setGeometry(ui.cam3mode4Lbl->geometry().x(), ui.cam3mode4Lbl->geometry().y(), ui.cam3mode4Lbl->geometry().width()-1, ui.cam3mode4Lbl->geometry().height()-1);
    m_ControlMap[quadContainer[2]] = CCamWindow(ui.cam3mode4Lbl, ui.cam3mode4nameLbl);
    quadContainer.push_back(new QX11EmbedContainer(this));
    quadContainer[3]->setGeometry(ui.cam4mode4Lbl->geometry().x(), ui.cam4mode4Lbl->geometry().y(), ui.cam4mode4Lbl->geometry().width()-1, ui.cam4mode4Lbl->geometry().height()-1);
    m_ControlMap[quadContainer[3]] = CCamWindow(ui.cam4mode4Lbl, ui.cam4mode4nameLbl);
    m_ContainerMap[4] = quadContainer;
}

void CIhm::backgroundClicked() {
    printf("background\n");
        if(ui.timePb->isVisible()){
            hideTimeBar();
        } else {
            showTimeBar();
        }
}