Qt中自定义的信号和槽可以和系统的信号/槽连接吗?
自定义的信号能否和Qt的信号currentRowChanged(int)、Qt的槽函数setCurrentIndex(int)连接?我试着用自定义的信号Qt槽函数setCurrentIndex(int)连接,然后发送(emit)一个信号,传递一个整型值,但是没反应。
当然是可以的,提问要讲方法,你不贴代码谁知道哪里不对{:2_136:} 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)也执行了,就是板子上界面没任何变化。
你先自己定义一个槽,看下消息有没有正确发送出去
页:
[1]