我在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 );
}
电贺。
答案 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()) );