Я пытаюсь сделать программу, которая позволяет пользователю щелкнуть по ячейке в 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, но я не уверен, как это исправить. Любая помощь была бы принята с благодарностью
U отсутствует указатель адреса ... подключения (и меню, SIGNAL (срабатывает (QAction *)), это, SLOT (on_menu_clicked (QAction *))) ; – Devopia
Благослови твою прекрасную душу! – mint