在 Qt 中连接按钮

min*_*234 3 c++ qt

好的。所以我有简单的 Qt 应用程序,其中有lineEditQObjects pushButtonlineEdit按下按钮应打印文件中的文本.txt。简单的。当函数不带任何参数(只是将一些文本写入文件)时,我运行了这段代码。现在看起来像这样:

主窗口.h

private slots:
    static void on_some_pushButton_clicked(QString s);
Run Code Online (Sandbox Code Playgroud)

主窗口.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
    ui (new Ui::MainWindowClass)
{
    ui->setupUi(this);
    ui->pushButton->setText("GO");
    //Connecting a GO pushButton to a func which saves your name into a .txt file
    auto s = ui->lineEdit->text();
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_some_pushButton_clicked(s)));
}

void MainWindow::on_some_pushButton_clicked(QString s)
{
    FILE *file;
    file=fopen("data.txt", "wt");
    fprintf(file, "XD\n");
    auto z=(s.toStdString()).c_str();
    fprintf(file, "%s", z);
    fclose(file);
}
Run Code Online (Sandbox Code Playgroud)

main.cpp(以防万一)

#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("Qt App");
    w.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

而且,好吧,它没有任何作用。我没有看到正在创建的文件或类似的内容。我究竟做错了什么?

PS 当我说它无需参数即可工作时,我的意思是:

主窗口.cpp

void MainWindow::button_clicked()
{
    FILE *file;
    file=fopen("data2.txt", "wt");
    fprintf(file, "Works with no args");
    fclose(file);
}
Run Code Online (Sandbox Code Playgroud)

和:

connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(button_clicked()));
Run Code Online (Sandbox Code Playgroud)

Yuu*_*shi 6

这种connect格式:

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_some_pushButton_clicked(s)));
Run Code Online (Sandbox Code Playgroud)

是错的。SIGNAL()在and中SLOT(),您应该提供函数声明,也就是说,它应该包含types,而不是变量。所以这应该看起来像:

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_some_pushButton_clicked(QString)));
Run Code Online (Sandbox Code Playgroud)

s您正在尝试绑定要传递的变量 ( )。为了做你想做的事情,你需要有一个实例变量(或者有一个闭包,或者将信号链接在一起......但实例变量方式更容易解释)。

class MainWindow
    : public QMainWindow
{
    // Stuff as before

private:
    QString s;
};
Run Code Online (Sandbox Code Playgroud)

然后,在你的构造函数中:

s = ui->lineEdit->text();
Run Code Online (Sandbox Code Playgroud)

当然,QString现在这根本就不是通过 a (它只是读取一个成员变量),函数不需要它作为参数;应该connect回到看起来像:

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_some_pushButton_clicked()));
Run Code Online (Sandbox Code Playgroud)

您可能还应该发布应用程序的输出,因为 Qt 可能会No such slot在您单击按钮时说出一些内容。