подключите QAction к слоту

Я пытаюсь понять, почему QObject :: connect иногда выполняет свою работу, а иногда — нет.

я был бы очень рад любой помощи, я уже много гуглял / читал документацию / и искал возможные дубликаты вопроса, случаи с дубликатами не решили мою проблему

У меня 2 Qt Projects очень похожий код, и так как несколько часов я пытаюсь выяснить, почему он не работает.

рабочий тестовый проект:

toolbar.h

#ifndef TOOLBAR_H
#define TOOLBAR_H
#include <QMainWindow>
#include <QApplication>

class Toolbar : public QMainWindow
{
Q_OBJECT

public:
Toolbar(QWidget *parent = 0);
public slots:
void dosmt();

signals:
void test();
void test2();

private:
static bool button1;

};
#endif // TOOLBAR_H

toolbar.cpp

#include "toolbar.h"#include <QToolBar>
#include <QIcon>
#include <QAction>
#include <QLabel>
#include <iostream>

bool Toolbar::button1=false;

Toolbar::Toolbar(QWidget *parent): QMainWindow(parent)
{
QString path="../res/login_photo.png";
QPixmap newpix(path);
QPixmap openpix("../res/global.png");
QPixmap quitpix("new.png");

QToolBar *toolbar = addToolBar("main toolbar");
QAction *hallo=toolbar->addAction(QIcon(newpix), "1");
toolbar->addAction(QIcon(openpix), "Open File");
toolbar->addSeparator();
QAction *quit = toolbar->addAction(QIcon(quitpix),
"Quit Application");

connect(hallo,SIGNAL(triggered()),this,SLOT(dosmt()));
connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
}

void Toolbar::dosmt()
{
button1=!button1;
if(button1){
emit test();
}else{
emit test2();
}

}

Теперь я хотел улучшить макет так, чтобы я мог вставить все элементы, которые мне могут понадобиться, поэтому я сделал новый проект, который работает, если я закомментирую неработающую линию разъема для подключения. панель инструментов просто переименовывается в mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>

class MainWindow : public QMainWindow
{
Q_OBJECT

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

public slots:
void dosmt();
void h1();

signals:
void s1();
};

mainwindow.cpp

#include "mainwindow.h"#include <QVBoxLayout>
#include <QToolBar>
#include <QApplication>
#include <QObject>MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QPixmap newpix("../res/login_photo.png");
QPixmap openpix("../res/global.png");
QPixmap quitpix("new.png");

QToolBar *toolbar = new QToolBar;
QAction* hallo=toolbar->addAction(QIcon(newpix), "Page1");
toolbar->addAction(QIcon(openpix), "Open File");
QAction *quit = toolbar->addAction(QIcon(quitpix),"Quit Application");

вот мое сообщение об ошибке ниже

connect(hallo,SIGNAL(triggered()),this,SLOT(h1()));

нет проблем, когда:

connect(this,SIGNAL(s1()),this,SLOT(h1()));

остальное:

    QVBoxLayout * mvbox = new QVBoxLayout;
mvbox->addWidget(toolbar);

setCentralWidget(new QWidget);
centralWidget()->setLayout(mvbox);
}
void MainWindow::dosmt()
{
qDebug("happ");
}
void MainWindow::h1()
{
qDebug("happ");
}

MainWindow::~MainWindow()
{

}

Сообщение об ошибке (Fehler):

/cpp/qt/GUItest1/mainwindow.cpp:19:
Fehler: no matching function for call to 'MainWindow::connect(QAction*&, const char*, MainWindow* const, const char*)'
connect(hallo,SIGNAL(triggered()),this,SLOT(h1()));

followed by a bunch of not helping stuff i just took the ones that look remotly usefull

Qt/5.4/gcc_64/include/QtCore/qobject.h:213: Fehler:
no type named'Object' in 'struct QtPrivate::FunctionPointer<const char*>'
^
/Qt/5.4/gcc_64/include/QtCore/qobject.h:254: Fehler: invalid use of incomplete type 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'

/Qt/5.4/gcc_64/include/QtCore/qglobal.h:1056: Fehler: declaration of 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'
template <bool B, typename T = void> struct QEnableIf;
^
/Qt/5.4/gcc_64/include/QtCore/qobject.h:293:
Fehler: no type named 'Object' in 'struct QtPrivate::FunctionPointer<const char*>'

Поиграв, я обнаружил, что проблема заключается в сигнале QAction, потому что сигналы от Mainwindow могут быть связаны со слотами из основного окна.

единственное различие между первым и вторым проектом, по-видимому, заключается в том, как добавлена ​​панель инструментов

addToolBar

против

QToolBar *toolbar = new QToolBar; and
mvbox->addWidget(toolbar);

0

Решение

Вы забыли включить заголовок QAction в mainwindow.cpp.

#include <QAction>

Он должен компилировать вашу программу без ошибок.

2

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

Почему бы вместо этого не использовать SLOTS?

toolbar = addToolBar("main toolbar");
toolbar->addAction("Open", this, SLOT(open_file()) );
toolbar->addAction("New", this, SLOT(new_file());
toolbar->addAction("Quit", this, SLOT(quit_application());

Хотя в header:

[...]
public slots:
void open_file();
void new_file();
void quit_application();
[...]

Слоты являются наилучшей практикой QT, вы должны их использовать.

0

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