2015-04-05 140 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最佳实践,您应该使用它们。