nice026 发表于 2012-12-27 09:36:58

Qt中自定义的信号和槽可以和系统的信号/槽连接吗?

自定义的信号能否和Qt的信号currentRowChanged(int)、Qt的槽函数setCurrentIndex(int)连接?
我试着用自定义的信号Qt槽函数setCurrentIndex(int)连接,然后发送(emit)一个信号,传递一个整型值,但是没反应。

TQ-lkp 发表于 2012-12-27 14:46:19

当然是可以的,提问要讲方法,你不贴代码谁知道哪里不对{:2_136:}

nice026 发表于 2012-12-27 17:48:35

TQ-lkp 发表于 2012-12-27 14:46 static/image/common/back.gif
当然是可以的,提问要讲方法,你不贴代码谁知道哪里不对

帮忙看下。
layout1.h//--------------------
#ifndef LAYOUT1_H
#define LAYOUT1_H
#include <iostream>//
#include <QDialog>
#include <QtGui/QDialog>
#include <QWidget>
#include <QListWidget>
#include <QStackedWidget>
#include <QHBoxLayout>
#include <QtGui/QApplication>
#include <QPushButton>
#include <QTextCodec>
#include <QLabel>
#include <QComboBox>
#include <QLCDNumber>
#include "widget1.h"
#include "widget2.h"
#include "widget3.h"
#include "widget4.h"
#include "widget5.h"
#include "widget6.h"
#include "widget7.h"
#include "widget8.h"
class layout1 :public QWidget
{
    Q_OBJECT
public:
    layout1(QWidget *parent = 0);
    void selectMenu(int menuNum);
signals:
    void sendValue(int menuKey);
private:
   int menuKey;
    QListWidget *listWidget;
   QStackedWidget *stackedWidget;
    QSplitter *splitter;
      QLabel *label1;
    QLabel *label2;
    QLCDNumber lcdNumber1;
    QLCDNumber lcdNumber2;
    QLCDNumber lcdNumber3;
    QHBoxLayout hLayout;
    QHBoxLayout buttonLayout;
    QVBoxLayout rightLayout;
    QVBoxLayoutleftLayout;
    QLabel *labelIcon;
    Widget1widget1;
    Widget2widget2;
    Widget3widget3;
    Widget4widget4;
    Widget5widget5;
    Widget6widget6;
    Widget7widget7;
    Widget8widget8;
};
#endif // LAYOUT1_H
---------------------
layout1.cpp-----
#include <QtGui>
#include "layout1.h"
layout1 ::layout1(QWidget *parent): QWidget(parent)
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
    setStyleSheet(QString::fromUtf8("layout1{background-color: rgb(51, 204, 224);}"));
    setWindowTitle(tr("Stacked Windgets"));

       listWidget = new QListWidget();
      splitter = new QSplitter(Qt::Horizontal);
      splitter->setOpaqueResize(true);
       listWidget->setIconSize(QSize(20,20));
   listWidget->setFont(QFont("wqy-zenhei", 18, QFont::Black));
   listWidget->addItem("      A");
    listWidget->addItem("      B");
   
    listWidget->addItem(new QListWidgetItem( QIcon(tr("1/icon.png")),tr("选择1")));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")),tr("选择2") ));
   listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")),tr("选择3") ));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")), tr("选择4")));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")), tr(" 选择5")));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")), tr("选择6")));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")), tr("选择7")));
    listWidget->addItem( new QListWidgetItem(QIcon(tr("1/icon.png")), tr("选择8")));

    stackedWidget = new QStackedWidget;
    stackedWidget->addWidget(&widget1);
    stackedWidget->addWidget(&widget2);
    stackedWidget->addWidget(&widget3);
    stackedWidget->addWidget(&widget4);
    stackedWidget->addWidget(&widget5);
    stackedWidget->addWidget(&widget6);
    stackedWidget->addWidget(&widget7);
    stackedWidget->addWidget(&widget8);
    stackedWidget->setCurrentIndex(1);
   
    connect(listWidget, SIGNAL(currentRowChanged(int)), stackedWidget, SLOT(setCurrentIndex(int)));
   connect(this,SIGNAL(sendValue(int)),stackedWidget,SLOT(setCurrentIndex(int)));
   
    label1 = new QLabel(tr("   下"));
    label2 = new QLabel(tr("上"));
    label2->setFont(QFont("wqy-zenhei", 14, QFont::Black));
    label1->setFont(QFont("wqy-zenhei", 14, QFont::Black));
    QGridLayout*Layout = new QGridLayout();
    Layout->addWidget(label1, 2, 0);
    Layout->addWidget(label2, 0, 0);
    QWidget *edit = new QWidget();
    edit->setLayout(Layout);
      splitter->addWidget(listWidget);
    splitter->addWidget(stackedWidget);
    splitter->addWidget(edit);
    splitter->setStretchFactor(6,1);
      QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(listWidget);
    mainLayout->addWidget(stackedWidget);
    mainLayout->addWidget(edit);
    mainLayout->setStretchFactor(listWidget, 2);
    mainLayout->setStretchFactor(stackedWidget, 3);
    mainLayout->setStretchFactor(edit, 1);
}

void layout1::selectMenu(int menuNum)
{
    static int oldNumber=0;
    if(oldNumber!=menuNum){
       emit this->sendValue(menuNum);//不知信号是否发送?
       std::cout<<"selcet the menu "<<std::dec<<menuNum<<"!"<<std::endl;//按键时此处信息可正常打印,且menuNum值正确
    }
    oldNumber = menuNum;
}
//end of layout1.cpp

此程序本意是在屏幕左侧显示菜单列表,右侧显示对应菜单内容。程序在pc下用鼠标可正常操作,程序下到板子上以后,我想用板子上的按键操作。我做了这样的处理,在检测到按键后调用类layout1的成员函数selectMenu()(传递过来的是要选择的菜单项值),在此函数里发送自定义的一个信号。这个信号已经和Qt的槽函数setCurrentIndex(int)连接。但实际上按键后selectMenu()里打印的信息可通过终端看到,应该emit this->sendValue(menuNum)也执行了,就是板子上界面没任何变化。
   



TQ-lkp 发表于 2012-12-27 17:57:00

你先自己定义一个槽,看下消息有没有正确发送出去
页: [1]
查看完整版本: Qt中自定义的信号和槽可以和系统的信号/槽连接吗?