以下简要代码中的QObject::connect
语句显示
QObject::connect: Incompatible sender/receiver arguments
QTableView::clicked(QModelIndex) --> QTextEdit::setText(QString)
如何从QTableView中的条目中捕获名称(foo,bar)并在相邻窗格的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中可以使用另一种方法(在编译期间进行校对)来处理事件。如果是这样的话,那个成语中的解决方案的暗示会更好。
答案 0 :(得分:1)
错误信息非常清楚。您无法将信号连接到具有不兼容参数的插槽。您需要在基于QObject
的类或非成员函数中创建一个插槽。此函数应具有QModelIndex
参数。将QTableView::clicked(QModelIndex)
连接到该功能。在该功能中,您可以使用textEdit->setText(index.data().toString());
为文本编辑设置新文本。
您需要确保在函数中可以访问textEdit
变量,例如如果函数是类成员,则还需要使textEdit
成为类成员。使用Qt Creator创建Designer表单类并使用Designer界面在类中创建一个插槽很方便。