2017-04-12 85 views
0

我是QT Creator GUI的新手,我很難用信號和插槽。我使用QT 4.2.1來練習一個詞搜索拼圖qt如何連接QPushButton的二維數組並返回位置

下面是我的代碼的一部分,使用矢量創建一個2D拼圖。我試圖使用數組,但拼圖的大小將由用戶決定。我有很多使用數組的編譯錯誤。所以我決定使用Vector

我試過了這個帖子的一些選項:Get index of QPushButton on 2D array QPushButton但是它們都不起作用。

你能幫我看看爲什麼信號和插槽沒有連接?有沒有辦法檢查信號是否連接? 我將不勝感激任何幫助和反饋。謝謝!

void MainWindow::displayPuzzle(QVector<QVector<QPushButton*>>& button, QVector<QVector<QChar>> puzzle2D){ 

widget1 = new QWidget; 
QGridLayout* l = new QGridLayout; 
QSignalMapper mapper; 

for (int r = 0; r < puzzle2D.size(); r++) { 
    QVector<QPushButton*> vect; 
    for (int c = 0; c < puzzle2D[r].size(); c++) { 

     //format the button 
     vect.push_back(new QPushButton); 
     vect.last()->setText(puzzle2D[r][c]); 
     vect.last()->setFixedSize(60,60); 
     vect.last()->show(); 
     auto pos = QString{"%1 %2"}.arg(r).arg(c); 

     //connect with signals and slots 
     mapper.connect(vect.last(), SIGNAL(clicked()), SLOT(map())); 
     mapper.setMapping(vect.last(), pos); 

     //add button to layout 
     l->addWidget(vect.last(), r, c); 
     l->setSpacing(0); 
     l->setMargin(0); 
     l->setContentsMargins(-1,-1,-1,-1); 

    } 
    button.push_back(vect); 
} 
connect(&mapper, SIGNAL(mapped(QString)), SLOT(puzzleClick(QString))); 

widget1->setLayout(l); 

} 

void MainWindow::puzzleClick(QString text){ 

    int r = text.split(" ").at(0).toInt(); 
    int c = text.split(" ").at(1).toInt(); 

    QMessageBox::information(this, "click:", r + " " + c); 

} 
+0

爲什麼心臟使用Qt 4.2? Qt目前版本爲5.8 ... – valleymanbs

+0

也許您正在使用Qt Creator版本4.2.1?您的應用程序鏈接了哪個Qt庫版本? – valleymanbs

回答

0

你連接的答案非常完整和有用,我認爲你應該堅持這一點。任何有關這些方法的建議都只是重寫原來的答案。也許你可以問一些更多特定關於你不能理解這些選項。

該答案中未提及的另一個解決方案是實現一個擴展QPushButton的類,截取clicked()信號並將其重新發射到您想要的數據。使用Qt5和C++ 11中的lambda函數可以獲得同樣的結果:看看這個:qt-custom-qpushbutton-clicked-signal這個問題的兩個答案解釋瞭如何做到這一點。

+0

我使用了lambda函數,但後來認識到它是Qt 5x的語法。這就是爲什麼我改變爲現在的方法。 幾年前我下載了QT,我可以免費下載的版本是4.2.1。但是讓我嘗試更新它並使用Lambda函數。非常感謝你! – Nina

+0

當我使用5.8版本時,它完美地工作。謝謝 – Nina

+0

很高興能有用,祝你好運 – valleymanbs