【发布时间】:2017-05-20 03:51:39
【问题描述】:
我有类MainWindow,它将包含几个QWidgetTables,它们有自己的标题和其他成员。现在,我想在MainWindow 类中定义自定义表类,因为它们非常简单。请参阅下面的示例:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(SSHClient &client, QWidget *parent = 0);
public slots:
struct Workflow_Table {
QTableWidget* widget;
QStandardItemModel model;
QStringList headers;
void addRow(){}
void removeRow(){}
} workflow_table;
private:
SSHClient& client;
Ui::MainWindow* ui;
CTL ctl;
};
在Ui::MainWindow 内,我有QPushButtons 可以为workflow_table 添加和删除行。我想将这些QPushButton::clicked 信号连接到
MainWindow::Workflow_Table::addRow,但我没有任何成功,我也不知道我正在尝试的是否可能。
MainWindow::MainWindow(SSHClient &client, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
client(client)
{
ui->setupUi(this);
//class CTL is a not a QObject class, yet std::bind causes it to act like a slot here. This statement compiles and runs fine.
connect(ui->button_load_ctl, &QPushButton::clicked, this, std::bind(&CTL::saveas, &ctl, "saved.ctl"));
//Error: 3 Arguments provided - 4 Expected. I'm almost certain this won't work.
connect(ui->button_add, &QPushButton::clicked, this, &MainWindow::Workflow_Table::addRow);
//Error: Not a signal or slot declaration. Not sure why this isn't working.
connect(ui->button_add, &QPushButton::clicked, this, std::bind(&MainWindow::Workflow_Table::addRow, &workflow_table));
//This doesn't work either. Error 1.
connect(ui->button_add, &QPushButton::clicked, this, std::bind(&Workflow_Table::addRow, &workflow_table));
}
我是否可以将 MainWindow::Workflow_Table::addRow(不将 Workflow_Table 设为 QObject)连接到来自 MainWindow 的 QPushButton::clicked 信号?
简单的解决方案是使Workflow_Table 成为QObject,但我很好奇我是否仍然可以连接Workflow_Table 的函数,因为它们是在QObject 的范围内定义的。我已经能够通过使用 std::bind (如CTL::saveas 函数)来连接其他非插槽函数,所以我想我可以在这里做类似的事情。我还尝试将Workflow_Table 移动到public 和public slots 访问说明符下,但都没有奏效。
【问题讨论】:
-
最简单的方法是将
addRow()放入onPushButton_clicked()。使用元对象系统对于单击和添加行来说是相当大的。
标签: c++ qt qt-signals