找回密码
 立即注册
收起左侧

qt信号信号槽问题

6
回复
7784
查看
[复制链接]
累计签到:9 天
连续签到:1 天
来源: 2013-9-28 20:22:50 显示全部楼层 |阅读模式
1Qter豆
我大学学的电子信息,一直都是玩单片机,一直想给自己设计的电路设计一个上位机,该开始我学c++,学mfc,感觉编程很不灵,什么都是要死记硬背他的机制,看到那个WinMain函数,窗口句柄,消息结构,消息循环,让俺觉得很蛋疼。后来我认识了qt,我买了一本《qt gui c++编程第二版》紧锣密鼓的开始学习,我看到了自己编的界面,很欣喜,我期待我的上位机的出现。但学习的过程也遇到这样那样的问题,希望高手们不吝赐教,主要都是槽函数不存在的问题,用的qt4.8.3。
1,textChanged("clinked");槽不存在。
#include <QApplication>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLineEdit>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);

QWidget *window = new QWidget;
window->setWindowTitle("My Test");

    QLineEdit *label = new QLineEdit("Wait");
    QPushButton *button = new QPushButton("Test");

    QObject::connect(button,SIGNAL(clicked()),
                     label,SLOT(setText("Run"))
                     );

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label);
layout->addWidget(button);
window->setLayout(layout);

window->show();

return app.exec();
}
2,QMainWindow::about()槽不存在
//mainwindow.h
#include <QApplication>
#include <QMainWindow>
#include <QAction>
#include <QToolBar>
#include <QMenu>
#include <QMenuBar>
#include <QTextEdit>
#include <QMessageBox>


class QAction;
class QToolBar;
class QMenu;
class QTextEdit;
class QMenuBar;


class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = 0);
    //~MainWindow();
private slots:
    void about();
private:
    void creatAction();
        //1,创建设置动作
        QAction *newAction;
    QAction *openAction;
    QAction *saveAction;
    QAction *saveAsAction;
    QAction *aboutAction;
    QAction *aboutQtAction;
        //2,创建菜单并把动作加入菜单       
    QMenu *fileMenu;
    QMenu *editMenu;
    QMenu *toolsMeu;
    QMenu *optionsMenu;
    QMenu *helpMenu;
        //3,创建工具栏并把动作加入菜单
        QToolBar *fileToolBar;
    QToolBar *editToolBar;
        //创建中间窗口部件
        QTextEdit *textEdit;
};
//mainwindow.cpp

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)    MainWindow(parent){    creatAction();    //创建菜单并把动作加入菜单    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));        fileMenu->addAction(newAction);    fileMenu->addAction(openAction);    fileMenu->addAction(saveAction);
    QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
    QMenu *toolsMeu = menuBar()->addMenu(tr("&Tools"));
    QMenu *optionsMenu = menuBar()->addMenu(tr("&Options"));
    menuBar()->addSeparator();
    QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));    helpMenu->addAction(aboutAction);    helpMenu->addAction(aboutQtAction);
    //创建工具栏并把动作加入菜单    QToolBar *fileToolBar = addToolBar(tr("&File"));    fileToolBar->addAction(newAction);    fileToolBar->addAction(openAction);    fileToolBar->addAction(saveAction);
    QTextEdit *textEdit = new QTextEdit;    setCentralWidget(textEdit);}
void MainWindow::creatAction(){    //创建动作    newAction = new QAction(tr("&New"),this);    newAction->setIcon(QIcon(":/image/new"));//设置菜单图标    newAction->setShortcut(QKeySequence::New);//设置快捷键    //newAction->//    openAction = new QAction(tr("&Open"),this);    openAction->setIcon(QIcon(":/image/open"));    openAction->setShortcut(QKeySequence::Open);
    saveAction = new QAction(tr("&Save"),this);    saveAction->setIcon(QIcon(":/image/save"));    saveAction->setShortcut(QKeySequence::Save);
    aboutAction = new QAction(tr("&About"),this);    connect(aboutAction,SIGNAL(triggered()),this,SLOT(about()));
    aboutQtAction = new QAction(tr("About &Qt"),this);    connect(aboutQtAction,SIGNAL(triggered()),qApp,SLOT(aboutQt()));}
void MainWindow::about(){             QMessageBox::about(this, tr("About Spreadsheet"),             tr("<h2>Spreadsheet 1.1</h2>"                "<p>Copyright &copy; 2008 Software Inc."                "<p>Spreadsheet is a small application that "                "demonstrates QAction, QMainWindow, QMenuBar, "                "QStatusBar, QTableWidget, QToolBar, and many other "                "Qt classes."));}两个程序都是我自己写的,书上的代码都木有问题,我的代码老是某某槽函数不存在,我一直找不到答案。希望在这里得到解决。


最佳答案

查看完整内容

....但我始终没有想明白如果让一个QPushButton的按动去改变一个QLabel的显示应该如何去实现.... 例如:QPushButton *pushButton; 一个label:QLabel *label; 一个槽函数slots: void labelSlots(); 在构造函数中连接:connect(this, SIGNAL(clicked()), pushButton, SLOT(labelSlots()));这样就将pushButton的clicked信号响应函数连接到了void labelSlots();了。 然后你在void labelSlots();里面随便设置label显示什么了,例如: ...
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-9-28 20:22:51 显示全部楼层
camelback5 发表于 2013-9-29 11:16
看到过相关资料说信号和槽的参数要保持一致,或者槽的参数要比信号要少,但我始终没有想明白如果让一个QP ...

....但我始终没有想明白如果让一个QPushButton的按动去改变一个QLabel的显示应该如何去实现....
例如:QPushButton *pushButton;
一个label:QLabel *label;
一个槽函数slots: void labelSlots();
在构造函数中连接:connect(this, SIGNAL(clicked()), pushButton, SLOT(labelSlots()));这样就将pushButton的clicked信号响应函数连接到了void labelSlots();了。
然后你在void labelSlots();里面随便设置label显示什么了,例如:
this->label->setText(tr("我会啦!!!!!!!"));

这样label就显示"我会啦!!!!!!!"

代码是我随便写的,但是应该能通过编译
参与人数 1人气 +2 收起 理由
camelback5 + 2 很感谢,瞬间,想明白很多东西,我多谢谢试.

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-9-28 22:33:33 显示全部楼层
  QObject::connect(button,SIGNAL(clicked()),
                     label,SLOT(setText("Run"))
                     );
你的信号clicked()没有参数,干嘛要用个有参数的setText("Run")来做槽函数
connect(aboutQtAction,SIGNAL(triggered()),qApp,SLOT(aboutQt()));}
我不知道是不是一定要出错,但是有的时候函数只声明而没有定义会出错,我遇见过
回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2013-9-29 11:16:08 显示全部楼层
lzyinformation 发表于 2013-9-28 22:33
QObject::connect(button,SIGNAL(clicked()),
                     label,SLOT(setText("Run"))
        ...

看到过相关资料说信号和槽的参数要保持一致,或者槽的参数要比信号要少,但我始终没有想明白如果让一个QPushButton的按动去改变一个QLabel的显示应该如何去实现。我看过用qtcreator放置QLabel和QPushButton后点击clinked槽生成的代码但没有看懂。我一致都是手工编写代码,creator和designed都不太用。
其次第二个问题我主要关心的是about()槽不存在,我把它在MainWindow里面,但运行显示的是他的父对象QMainWindow不存在这个槽。想来这个槽应该是不存在的,只是我已经预声明了,上面的mainwindow.cpp复制出问题了,我再从新复制一下。先谢谢你的解答,当然我还需要继续努力。

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    MainWindow(parent)
{
    creatAction();
    //创建菜单并把动作加入菜单
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
        fileMenu->addAction(newAction);
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);

    QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));

    QMenu *toolsMeu = menuBar()->addMenu(tr("&Tools"));

    QMenu *optionsMenu = menuBar()->addMenu(tr("&Options"));

    menuBar()->addSeparator();

    QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAction);
    helpMenu->addAction(aboutQtAction);

    //创建工具栏并把动作加入菜单
    QToolBar *fileToolBar = addToolBar(tr("&File"));
    fileToolBar->addAction(newAction);
    fileToolBar->addAction(openAction);
    fileToolBar->addAction(saveAction);

    QTextEdit *textEdit = new QTextEdit;
    setCentralWidget(textEdit);
}

void MainWindow::creatAction()
{
    //创建动作
    newAction = new QAction(tr("&New"),this);
    newAction->setIcon(QIcon(":/image/new"));//设置菜单图标
    newAction->setShortcut(QKeySequence::New);//设置快捷键
    //newAction->//
    openAction = new QAction(tr("&Open"),this);
    openAction->setIcon(QIcon(":/image/open"));
    openAction->setShortcut(QKeySequence::Open);

    saveAction = new QAction(tr("&Save"),this);
    saveAction->setIcon(QIcon(":/image/save"));
    saveAction->setShortcut(QKeySequence::Save);

    aboutAction = new QAction(tr("&About"),this);
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(about()));

    aboutQtAction = new QAction(tr("About &Qt"),this);
    connect(aboutQtAction,SIGNAL(triggered()),qApp,SLOT(aboutQt()));
}

void MainWindow::about()
{
             QMessageBox::about(this, tr("About Spreadsheet"),
             tr("<h2>Spreadsheet 1.1</h2>"
                "<p>Copyright &copy; 2008 Software Inc."
                "<p>Spreadsheet is a small application that "
                "demonstrates QAction, QMainWindow, QMenuBar, "
                "QStatusBar, QTableWidget, QToolBar, and many other "
                "Qt classes."));
}
回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2013-9-29 13:46:46 显示全部楼层
第二个问题已经解决,程序中确守O_BJECT宏。
回复

使用道具 举报

累计签到:213 天
连续签到:1 天
2013-9-29 20:10:49 显示全部楼层
楼主没装qt creator?怎么会出现这种问题
回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2013-9-29 20:16:25 显示全部楼层
MLTRwhy 发表于 2013-9-29 20:10
楼主没装qt creator?怎么会出现这种问题

装的,一般出错了就用qtcreator打开看,我的意思是我一般不用creator和disigner直接生成代码,如果不用creator的话资源文件家过一次,没有成功。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了