我想了解爲什麼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);
爲什麼要訪問'toolbar-> hallo','toobar'對象沒有一個叫做hallo的屬性。即使您將它添加爲小孩,它也是在相同的範圍內定義的。所以使用'conenct(hallo,....);' – 2015-04-05 06:13:22
是啊我知道經過幾個小時的嘗試,我有創意,這是最後一次嘗試修復它發佈之前發佈變回更好,但不工作版本 – Philipp 2015-04-05 06:15:35
connect(this ,SIGNAL(S1()),對此,SLOT(H1()));工作正常,但與QAction對象,它不工作 – Philipp 2015-04-05 06:21:21