2015-05-28 77 views
0

我需要一個可點擊的QLabel,所以我創建了一個名爲「clickablelabel」的類,它是一個具有mouseReleaseEvent的QLabel。一旦被調用,它會發出「點擊(cid)」。 「cid」是clickablelabel中的一個公共變量,由clickablelabel設置。試圖將另一個類的信號連接到主類中的插槽

當 「點擊」 是發出我想改變我的主窗口中的UI,所以我這樣做:

clickablelabel.h

signals: 
    void clicked(int id); 

clickablelabel.cpp

void clickableLabel::mouseReleaseEvent (QMouseEvent * event) 
{ 
    emit clicked(cid); 
} 

mainwindow.h

private slots: 
    void test(int id); 

mainwindow.cpp

void MainWindow::test(int id){ 
    qDebug() << id; 
} 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    connect(clickableLabel, SIGNAL(clicked(int)), this, SLOT(test(int))); 
    ui->setupUi(this); 
} 

這是我得到的錯誤,當我嘗試運行程序:

"expected primary-expression before ',' token 
connect(clickableLabel, SIGNAL(clicked(int)), this, SLOT(test(int))); 
         ^" 

回答

0

您需要的插槽連接到信號在clickableLabel實例中,而不是該類本身。換句話說,構造clickableLabel的新實例,可能在您的構造函數中,然後將指向此對象的指針傳遞給connect函數。另外,MainWindow::test應該是我認爲的公共槽位;你有它宣佈爲私人。

可能的實現:

在mainwindow.h

class MainWindow: public QMainWindow { 
    /*Your stuff*/ 
    clickableLabel* label = nullptr; 
} 

在mainwindow.cpp:

MainWindow::MainWindow(QWidget* parent) { 
    label = new clickableLabel; 
    connect(label, SIGNAL(clicked(int)), this, SLOT(test(int))); 
} 
+0

由於主窗口是創建'連接類()'函數和擁有插槽不需要使MainWindow :: test成爲公共插槽。你可以給我發送一個示例代碼來創建實例並將指向該對象的指針傳遞給connect函數嗎?我試過'clickableLabel * clkLabel; clkLabel = new clickableLabel(5,this); '這使得代碼可編譯,但MainWindow :: test'在信號發出時不被調用。 – angeloid

+0

確保在'clickableLabel'定義中有'Q_OBJECT'宏。是否調用了'clickableLabel :: mouseReleaseEvent'?也嘗試運行QMake並重建您的項目。 – Carlton

+0

clickablelabel.h中的'#define Q_OBJECT' - 是否正確?調用'mouseReleaseEvent'。當我嘗試使用clickableLabel類中的connect()來調用那個插槽時,它也可以工作。我已經嘗試過你的代碼,但它說_'nullptr'沒有在這個範圍內聲明。 – angeloid