单击按钮中的()信号

时间:2012-03-10 23:13:30

标签: qt signals

我在Qt 4.8.0中的按钮信号有问题。我在Qt Designer中使用vs 2010。我在Designer中使用playButton名称创建了一个按钮。但之后我尝试将clicked()信号(在vs中)与CRenderArea中的函数连接(以启动计时器),但似乎它不起作用(函数start()在我把它放在构造函数中时起作用,所以这不是代码本身的问题)。代码正在编译,程序正在执行,但是在单击按钮后 - 没有任何反应(它应该移动一行)。

我真的很感谢你的帮助,开始玩Qt。

代码在这里(我希望文件的数量不会吓到你,这些是最简单的代码:)):

的main.cpp

#include "ts_simulator.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TS_simulator w;
    w.show();
    return a.exec();
}

ts_simulator.cpp:

TS_simulator::TS_simulator(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    p_map = new CRenderArea();
    ui.setupUi( this );
    p_map->setParent( ui.renderArea );

    // this doesn't work, why?
    connect( ui.playButton, SIGNAL( clicked() ), this, SLOT( p_map->start() ) );
}

CRenderArea.h

#pragma once

#include <QtGui>

class CRenderArea : public QWidget {
    Q_OBJECT // I think it's necessary?

    int x;
    QBasicTimer* timer;
public:
    CRenderArea();
public slots: // this is necessary too, right?
    void start();
private:
    void timerEvent( QTimerEvent* );
    void paintEvent( QPaintEvent* );
};

和CRenderArea.cpp:

#include "CRenderArea.h"

CRenderArea::CRenderArea() : x( 0 ) {
    setBackgroundRole( QPalette::Base );
    setMinimumSize( 591, 561 );
    setAutoFillBackground( true );
    timer = new QBasicTimer();

}

void CRenderArea::timerEvent( QTimerEvent* e ) {
    ++x;
    update();
}

void CRenderArea::paintEvent( QPaintEvent* p ) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::darkGray);
    painter.drawLine(2+x/10, 8, 60, 300);
}

void CRenderArea::start() {
    timer->start( 0, this );
}

电贺。

1 个答案:

答案 0 :(得分:5)

问题在于:

connect( ui.playButton, SIGNAL( clicked() ), this, SLOT( p_map->start() ) );

如果p_map是信号的接收者,并且它有Q_OBJECT,则应该写成:

connect( ui.playButton, SIGNAL( clicked() ), p_map, SLOT(start()) );