2015-04-28 7 views
1

Я создал проект Qt, и я добавил QPushButton со стилем, настроенным с QEvent и QMouseEvent. Я добавил слот к этой кнопке, но он не работает. Вот проект, как у меня:Сигнал и слот QEvent

Заголовок 1:

#ifndef MYQPUSHBUTTON_H 
#define MYQPUSHBUTTON_H 

#include <QPushButton> 
#include <QPalette> 

class myQPushButton : public QPushButton 
{ 
Q_OBJECT 
public: 
explicit myQPushButton(QWidget *parent = 0); 
~myQPushButton(); 
void enterEvent(QEvent*); 
void leaveEvent(QEvent*); 
void mousePressEvent(QMouseEvent * ); 
void mouseReleaseEvent(QMouseEvent * ); 

signals: 

public slots: 

private: 
QPalette *palette; 
}; 

#endif // MYQPUSHBUTTON_H 

Заголовок 2:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include "myQPushButton/myqpushbutton.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
Q_OBJECT 

public: 
explicit MainWindow(QWidget *parent = 0); 
~MainWindow(); 

private: 
Ui::MainWindow *ui; 
myQPushButton *button; 
}; 

#endif // MAINWINDOW_H 

Источник 1:

#include "myqpushbutton.h" 

myQPushButton::myQPushButton(QWidget *parent) : 
QPushButton(parent) 
{ 
setFixedSize(200,200); 
setIconSize(QSize(200,200)); 
setIcon(QIcon("D:/clockbox/qt/clockbox/exit_button_wwin_norm.png")); 
setFlat(true); 

} 

myQPushButton::~myQPushButton() 
{ 

} 

void myQPushButton::enterEvent(QEvent*) 
{ 
setIcon(QIcon("D:/clockbox/qt/clockbox/exit_button_wwin_enter.png")); 
} 

void myQPushButton::leaveEvent(QEvent*) 
{ 
setIcon(QIcon("D:/clockbox/qt/clockbox/exit_button_wwin_norm.png")); 
} 

void myQPushButton::mousePressEvent(QMouseEvent *) 
{ 
setIcon(QIcon("D:/clockbox/qt/clockbox/exit_button_wwin_pressed.png")); 
} 

void myQPushButton::mouseReleaseEvent(QMouseEvent *) 
{ 
setIcon(QIcon("D:/clockbox/qt/clockbox/exit_button_wwin_enter.png")); 
} 

Источник 2:

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
QApplication a(argc, argv); 
MainWindow w; 
w.show(); 
myQPushButton y; 
QObject::connect(y, SIGNAL(clicked()), &w, SLOT(close())); 

return a.exec(); 
} 

Источник 3:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
ui->setupUi(this); 
button = new myQPushButton(this); 
setCentralWidget(button); 
} 

MainWindow::~MainWindow() 
{ 
delete ui; 
} 

Я получаю эту ошибку на источнике 2:

ошибка: нет функции согласования для вызова «QObject :: подключить (myQPushButton &, Const символ *, MainWindow *, Const char *) ' QObject :: connect (y, SIGNAL (clicked()), & w, SLOT (close())); ^

Я хочу, чтобы эта кнопка была кнопкой выхода. Кто-нибудь может мне помочь?

+0

возможно w :: close()? –

+0

Может быть, '... connect (& y ....'? Переменная 'y' не является указателем. – vahancho

ответ

1

Чтобы преодолеть ошибку компиляции, вы должны изменить линию QObject::connect(y, SIGNAL(clicked()), &w, SLOT(close())); на QObject::connect(&y, SIGNAL(clicked()), &w, SLOT(close()));. QObject::connect требует указателя отправителя.

Но это не проблема, вы добавляете сигнал от кнопки, на самом деле не добавляются к окну (вы создаете кнопку y, который подключен к слоту close в main(), но позже в MainWindow вы создаете новая кнопка и добавить его в MainWindow в качестве центрального виджета, то Вы должны удалить кнопку из main() и сделать QObject::connect вызов в MainWindow::MainWindow как этот QObject::connect(button, SIGNAL(clicked()), this, SLOT(close()));

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    button = new myQPushButton(this); 
    QObject::connect(button, SIGNAL(clicked()), this, SLOT(close())); 
    setCentralWidget(button); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

главная:..

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
QApplication a(argc, argv); 
MainWindow w; 
w.show(); 

return a.exec(); 
} 
+0

сейчас у меня нет сообщения об ошибке, но когда я нажимаю кнопку, ничего не происходит –

+0

@ ErwinFülöp вы удалили от 'main' и добавить вызов' connect' для кнопки в 'MainWindow :: MainWindow'? –

+0

да, я сделал. Но у меня такая же проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^