2015-04-05 145 views
0

我想了解爲什麼QObject :: connect有時做這項工作,爲什麼有時它不。連接QAction插槽

我會很高興anykind的幫助下,我已經做了很多的谷歌/文檔閱讀/和尋找問題的可能dublicates,重複的情況下,並沒有解決我的問題

我有2個的Qt項目非常相似的代碼,並且從幾個小時我試圖找出爲什麼它不工作。

工作testproject:

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

} 

現在我想改善的佈局,這樣我可以把所有的元素我可能需要所以我做了一個新的項目,如果我評論不工作的連接信號插槽線,工作。工具欄basicly剛剛更名爲主窗口

#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內,因爲從主窗口信號可以從連接到插槽主窗口

項目一和二之間的唯一區別似乎是如何添加工具欄

addToolBar 

VS

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

爲什麼要訪問'toolbar-> hallo','toobar'對象沒有一個叫做hallo的屬性。即使您將它添加爲小孩,它也是在相同的範圍內定義的。所以使用'conenct(hallo,....);' – 2015-04-05 06:13:22

+0

是啊我知道經過幾個小時的嘗試,我有創意,這是最後一次嘗試修復它發佈之前發佈變回更好,但不工作版本 – Philipp 2015-04-05 06:15:35

+0

connect(this ,SIGNAL(S1()),對此,SLOT(H1()));工作正常,但與QAction對象,它不工作 – Philipp 2015-04-05 06:21:21

回答

2

你已經忘了,包括在mainwindow.cpp中的QAction頭。

#include <QAction> 

它應該編譯你的程序沒有錯誤。

+0

謝謝我認爲我需要去摧毀一些愚蠢的東西 – Philipp 2015-04-05 06:53:48

+0

請將問題標記爲[解決並接受我的編輯。 – 2015-04-05 07:01:10

+0

我想我是http://meta.stackexchange.com/questions/147531/how-mark-my-question-as-answered-on-stackoverflow – Philipp 2015-04-05 07:14:42

0

爲什麼不使用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最佳實踐,您應該使用它們。