显示下面简短代码中的 QObject::connect
语句
QObject::connect: Incompatible sender/receiver arguments
QTableView::clicked(QModelIndex) --> QTextEdit::setText(QString)
如何从 QTableView 中的条目捕获名称(foo、bar)并在相邻 Pane 的 QTextEdit 中显示该名称?
#include <QStandardItemModel>
#include <QApplication>
#include <QTableView>
#include <QTextEdit>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// Left Pane: Model
QStandardItemModel * tableModel = new QStandardItemModel(2, 1);
const char *name[2] = { "foo", "bar" };
for(int row=0; row<2; ++row) {
QString namestr = QString("%1").arg(name[row]);
QStandardItem * item = new QStandardItem(namestr);
item->setEditable(false);
tableModel->setItem(row, /*col*/0, item);
}
// Left Pane: View
QTableView * tableView = new QTableView;
tableView->setModel(tableModel);
tableView->resizeColumnsToContents();
tableView->adjustSize();
tableView->show();
// Right Pane
QTextEdit *textEdit = new QTextEdit("Uninitialized");
QObject::connect(tableView, SIGNAL(clicked(QModelIndex)), textEdit, SLOT(setText(QString)));
QSplitter splitter;
splitter.addWidget(tableView);
splitter.addWidget(textEdit);
splitter.show();
return app.exec();
}
另外,我依稀记得读过,有一种替代方法(在编译期间经过验证)将可用于处理 Qt 5.x 中的事件。如果是这样的话,用该习语提供解决方案的提示就更好了。
最佳答案
错误信息非常清楚。您无法将信号连接到具有不兼容参数的槽。您需要在基于 QObject 的类或非成员函数中创建一个槽。这个函数应该有QModelIndex
参数。将 QTableView::clicked(QModelIndex) 连接到该函数。在该函数中,您可以使用 textEdit->setText(index.data().toString());
设置用于文本编辑的新文本。
您需要确保在函数中可以访问 textEdit
变量,例如如果该函数是类成员,则还需要使 textEdit
成为类成员。使用 Qt Creator 创建 Designer 表单类并使用 Designer 界面在类中创建插槽非常方便。
关于qt - QTableView中捕获点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23638907/