1

なぜ QObject::connect が時々仕事をし、なぜ時々仕事をしないのかを理解しようとしています。

私はあらゆる種類の助けに本当に満足しています。私はすでに多くのグーグル/ドキュメントの読み取り/を行っており、質問の重複の可能性を探していますが、重複のケースは私の問題を解決しませんでした

私は 2 つの Qt Projects の非常によく似たコードを持っています。

作業中のテストプロジェクト:

ツールバー.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

ツールバー.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();
    }

}

今、レイアウトを改善して、必要なすべての要素を配置できるようにしたかったので、動作していない接続信号スロット ラインをコメントアウトすると動作する新しいプロジェクトを作成しました。ツールバーは基本的にメインウィンドウに名前が変更されています

#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();
};

メインウィンドウ.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()
{

}

エラー (フェーラー) メッセージ:

/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内にあることがわかりました

プロジェクト1と2の唯一の違いは、ツールバーの追加方法のようです

addToolBar 

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

2 に答える 2

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();
[...]

SLOTSは QT のベスト プラクティスであり、使用する必要があります。

于 2015-11-24T11:23:03.813 に答える