2015-11-04 1 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))); 

    } 

это главная часть окна программы. Это (будет) решателем sudoku, поэтому модель представляет сетку 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(menu, SIGNAL(triggered(QAction*)), this, SLOT(on_menu_clicked(QAction*))); 

C2664: «QMetaObject :: Connection QObject :: connect (const QObject *, const char *, const char *, Qt :: ConnectionType) const: не может преобразовать аргумент 1 из 'QMenu' в 'const QObject *'

Когда предполагается, что он функция on_menu_click выдает указанную выше ошибку

Я знаю, это означает, что меню не относится к типу QObject, но я не уверен, как это исправить. Любая помощь была бы принята с благодарностью

+2

U отсутствует указатель адреса ... подключения (и меню, SIGNAL (срабатывает (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: Нет такого слота MainWindow :: on_menu_triggered (QAction *) in .. \ 001 \ SudokuSolver \ mainwindow.cpp: 179. Строка 179 - это QObject :: connect (& menu, SIGNAL (triggered (QAction *)), это, SLOT (on_menu_triggered (QAction *))); и есть функция on_menu_triggered (QAction *), и она такова: void MainWindow :: on_menu_triggered (действие QAction *) { cout << "Hi Mom"; } Объявление on_menu_triggered (действие QAction *) находится в файле .h в общедоступных слотах. Есть идеи? (спасибо вам за вашу помощь до сих пор) – mint