QEvent Сигнал и Слот

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

Заголовок 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 :: connect (myQPushButton&, const char *, MainWindow *, const char *) ‘
QObject :: connect (y, SIGNAL (clicked ()), &w, слот (закрыть ()));
^

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

1

Решение

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

Но это не проблема, вы добавляете сигнал от кнопки, которая фактически не добавляется в окно (вы создаете кнопку 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();
}
1

Другие решения


По вопросам рекламы [email protected]