天嵌 ARM开发社区

 找回密码
 注册
查看: 2647|回复: 3

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

[复制链接]
nice026 发表于 2012-12-27 09:36:58 | 显示全部楼层 |阅读模式
自定义的信号能否和Qt的信号currentRowChanged(int)、Qt的槽函数setCurrentIndex(int)连接?
我试着用自定义的信号Qt槽函数setCurrentIndex(int)连接,然后发送(emit)一个信号,传递一个整型值,但是没反应。

TQ-lkp 发表于 2012-12-27 14:46:19 | 显示全部楼层
当然是可以的,提问要讲方法,你不贴代码谁知道哪里不对
 楼主| nice026 发表于 2012-12-27 17:48:35 | 显示全部楼层
TQ-lkp 发表于 2012-12-27 14:46
当然是可以的,提问要讲方法,你不贴代码谁知道哪里不对

帮忙看下。
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;
    QVBoxLayout  leftLayout;
    QLabel *labelIcon;
    Widget1  widget1;
    Widget2  widget2;
    Widget3  widget3;
    Widget4  widget4;
    Widget5  widget5;
    Widget6  widget6;
    Widget7  widget7;
    Widget8  widget8;
};
#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 | 显示全部楼层
你先自己定义一个槽,看下消息有没有正确发送出去
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-27 08:35 , Processed in 1.031257 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表