2015-11-04 144 views
0

我想做一個程序,允許用戶右鍵單擊GridView中的單元格,並從操作菜單中選擇。C++ Qt設置信號和插槽QMenu

我有菜單顯示,但無法獲得信號和插槽工作而不會出錯。我在的Qt 5.5 C++ 11的工作,不是很先進了Qt或C++還因此任何幫助,將不勝感激

using namespace std; 
QStandardItemModel* model; 
QStandardItem *value; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    model = new QStandardItemModel(9,9,this); 

    ui->tableView->setModel(model); 
    ui->tableView->setShowGrid(true); 
    ui->tableView->setWordWrap(true); 
    //to allow menu 
    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); 

for(int row = 0; row < 9; row++){ 
      ui->tableView->setRowHeight(row, 75); 
      for(int col = 0; col < 9; col++){ 
       ui->tableView->setColumnWidth(col, 75); 
       QFont f("Consolas"); 

       f.setPointSize(10); 
       value = new QStandardItem(QString("1 2 3\n4 5 6\n7 8 9")); 


       if ((row < 3 && col < 3) || (row > 5 && col < 3) 
         || (row < 3 && col > 5) || (row > 5 && col > 5) 
         || ((row > 2 && row < 6) && (col > 2 && col < 6))){ 
        QBrush b(QColor("Moccasin")); 
        value->setBackground(b); 
       } 

       value->setFont(f); 
       value->setTextAlignment(Qt::AlignCenter); 
       model->setItem(row,col,value); 
      } 
     } 

     //connects model so functions run when a cell's text is changed 
     connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(on_cell_changed(QStandardItem*))); 
     //this sets up the menu 
     connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(menuRequest(QPoint))); 

    } 

這是程序的主窗口的一部分。它是(將成爲)一個數獨求解器,所以模型代表9x9網格,並且for循環用輸入選項填充網格(但這不是我遇到的問題)。我需要與下面的菜單部分幫助(以上只是對上下文):

void MainWindow::menuRequest(QPoint pos) 
{ 
    QModelIndex index = ui->tableView->indexAt(pos); 
    std::cout << "MainWindow::menuRequest - at" << " QModelIndex row = " << 
       index.row() << ", column = " << index.column() << std::endl; 
    QMenu menu(this); 

    QMenu setValues("Initialize Grid", this); 
    QAction *setValue1; 
    QAction *setValue2; 
    QAction *setValue3; 
    QAction *setValue4; 
    QAction *setValue5; 
    QAction *setValue6; 
    QAction *setValue7; 
    QAction *setValue8; 
    QAction *setValue9; 
    setValue1 = setValues.addAction("Set value to 1"); 
    setValue2 = setValues.addAction("Set value to 2"); 
    setValue3 = setValues.addAction("Set value to 3"); 
    setValue4 = setValues.addAction("Set value to 4"); 
    setValue5 = setValues.addAction("Set value to 5"); 
    setValue6 = setValues.addAction("Set value to 6"); 
    setValue7 = setValues.addAction("Set value to 7"); 
    setValue8 = setValues.addAction("Set value to 8"); 
    setValue9 = setValues.addAction("Set value to 9"); 

    connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(on_menu_clicked(QAction*))); 

    menu.addMenu(&setValues); 
    QAction *action = menu.exec(
       ui->tableView->viewport()->mapToGlobal(pos)); 

} 

void MainWindow::on_menu_clicked(QAction*){ 
    cout << "test menu click worked"; 
} 

在MenuRequest功能CONNECT語句中拋出一個錯誤:

connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(on_menu_clicked(QAction*))); 

C2664:「QMetaObject ::連接QObject :: connect(const QObject *,const char *,const char *,Qt :: ConnectionType)const':無法將參數1從'QMenu'轉換爲'const QObject *'

當它應該轉到on_menu_click函數拋出上述錯誤

我知道這意味着菜單不是QObject類型,但我不知道如何解決這個問題。任何幫助將不勝感激

+2

ü缺少地址指針...連接(菜單,信號(觸發(*的QAction)),這一點,SLOT(on_menu_clicked(的QAction *))) ; – Devopia

+0

祝福你美麗的靈魂,它的工作! – mint

回答

0

正如註釋中所述,connect()函數中的第一個參數需要是一個指針。該文檔指出以下幾點:

connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)

http://doc.qt.io/qt-5/qobject.html#connect

+0

謝謝!那個錯誤消失了,但現在我有另一個。它表示QObject :: connect:在.. \ 001 \ SudokuSolver \ mainwindow.cpp中沒有這樣的插槽MainWindow :: on_menu_triggered(QAction *):179。第179行是QObject :: connect(&menu,SIGNAL(triggered(QAction *)),this,SLOT(on_menu_triggered(QAction *))); 並且有一個on_menu_triggered(QAction *)函數,它是這樣的:void MainWindow :: on_menu_triggered(QAction * action){0} {「Hi Mom」; } on_menu_triggered(QAction * action)的聲明位於公共時隙下的.h文件中。有任何想法嗎? (到目前爲止,感謝你的幫助) – mint