簡體   English   中英

將 QPushButton::clicked 信號連接到插槽時出錯

[英]Error while connecting QPushButton::clicked signal to a slot

首先,我使用 for 循環創建了大約 20 個按鈕。 並使用 if else 循環命名它們。 現在,我想將每個按鈕與新對話框連接起來。 如果我使用 QT 的設計模式,當我按下connect(ui->pushButton_0, SIGNAl(released()), SLOT(digit_pressed())類似這樣的東西時,它會顯示按鈕的名稱。但是,我不不知道我作為 for 和 if else 循環制作的按鈕的名稱connect(ui-> .......)也沒有顯示任何預測。我如何鏈接這些按鈕和一個新的對話框?

這是我的代碼:

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();

};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include "amputation.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->)



    QPixmap pix("/home/skanda/Desktop/D4564.png");
    ui->label_2->setPixmap(pix);
    setWindowTitle("First Aid");

    QVBoxLayout *lay = new QVBoxLayout();
    int i;
    for(i=0;i<25;i++)
    {
        if(i==0){
             QPushButton *button = new QPushButton("Amputation");
             lay->addWidget(button);
        }
        else if(i==1){
            QPushButton *button = new QPushButton("Asthama");
            lay->addWidget(button);

        }
        else if(i==2){
            QPushButton *button = new QPushButton("Bleeding");
            lay->addWidget(button);

        }
        else if(i==3){
            QPushButton *button = new QPushButton("Burns");
            lay->addWidget(button);

        }
        else if(i==4){
            QPushButton *button = new QPushButton("Chest Pain");
            lay->addWidget(button);

        }
        else if(i==5){
            QPushButton *button = new QPushButton("Diarrhoea");
            lay->addWidget(button);

        }
        else if(i==6){
            QPushButton *button = new QPushButton("Drowning");
            lay->addWidget(button);

        }
        else if(i==7){
            QPushButton *button = new QPushButton("Epilepsy");
            lay->addWidget(button);

        }
        else if(i==8){
            QPushButton *button = new QPushButton("Fainting");
            lay->addWidget(button);

        }
        else if(i==9){
            QPushButton *button = new QPushButton("Fever");
            lay->addWidget(button);

        }
        else if(i==10){
            QPushButton *button = new QPushButton("Food Poisoning");
            lay->addWidget(button);

        }
        else if(i==11){
            QPushButton *button = new QPushButton("Fracture");
            lay->addWidget(button);

        }
        else if(i==12){
            QPushButton *button = new QPushButton("Head Injury");
            lay->addWidget(button);

        }
        else if(i==13){
            QPushButton *button = new QPushButton("Muscle Strain");
            lay->addWidget(button);

        }
        else if(i==14){
            QPushButton *button = new QPushButton("No breathing");
            lay->addWidget(button);

        }
        else if(i==15){
            QPushButton *button = new QPushButton("Nose bleed");
            lay->addWidget(button);

        }
        else if(i==16){
            QPushButton *button = new QPushButton("Poisoning");
            lay->addWidget(button);

        }
        else if(i==17){
            QPushButton *button = new QPushButton("Snake Bites");
            lay->addWidget(button);

        }
        else if(i==18){
            QPushButton *button = new QPushButton("Stroke");
            lay->addWidget(button);

        }
        else if(i==19) {
            QPushButton *button = new QPushButton("Sun Burn");
            lay->addWidget(button);

        }
        else if(i==20) {
            QPushButton *button = new QPushButton("Testicle Pain");
            lay->addWidget(button);

        }
        else if(i==21) {
            QPushButton *button = new QPushButton("Ulcer");
            lay->addWidget(button);

        }
        else if(i==22) {
            QPushButton *button = new QPushButton("Child delievery");
            lay->addWidget(button);

        }
        else if(i==23) {
            QPushButton *button = new QPushButton("Heart Attack");
            lay->addWidget(button);

        }
        else {
            QPushButton *button = new QPushButton("Gastric");
            lay->addWidget(button);

        }
    }


    ui->scrollContents->setLayout(lay);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked(){
    Amputation amp;
    amp.setModal(true);
    amp.show();
}

**在這些代碼中,我通過創建on_pushButton_clicked()函數來on_pushButton_clicked()運氣。 但是,這只是嘗試。 **

就像在編程中一切都在做飯一樣,:),讓我們看看connect()的成分是什么:

connect(sender, &Sender::signal, receiver, &Receiver::slot);

所以發送者是buttons ,信號是clicked ,接收者本身,即this ,以及插槽on_pushButton_clicked

我看到不必要的 if-else,一切都可以簡化為:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include "amputation.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    QPixmap pix("/home/skanda/Desktop/D4564.png");
    ui->label_2->setPixmap(pix);
    setWindowTitle("First Aid");

    QVBoxLayout *lay = new QVBoxLayout();
    QStringList names{"Amputation", "Asthama", "Bleeding", "Burns", "Chest Pain",
                      "Drowning", "Diarrhoea", "Epilepsy", "Fainting", "Fever",
                      "Food Poisoning", "Fracture", "Head Injury", "Muscle Strain",
                     "No breathing", "Nose bleed", "Poisoning", "Snake Bites",
                      "Stroke","Sun Burn", "Testicle Pain", "Ulcer", "Child delievery",
                      "Heart Attack", "Gastric"};
    for(const QString & name: names)
    {
        QPushButton *button = new QPushButton(name);
        lay->addWidget(button);
        connect(button, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked)

    }
    ui->scrollContents->setLayout(lay);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked(){
    Amputation amp;
    amp.setModal(true);
    amp.show();
}

筆記:

避免使用舊的連接方式,有很多缺點,請閱讀以下鏈接的內容以獲取更多信息:

  1. 使所有這些QPushButton成員成為一個類,以便正確創建和銷毀它們,而不是在循環中創建它們。

  2. 一旦你把每一個都作為一個單獨的成員,然后有一個方法InitializeConnections()並使用 Qt 連接語法建立它下的所有連接。

如果您認為這些按鈕是MainWindow類的一部分,那么您的類可能如下所示:

class MainWindow{
    ...
    ...
    private :
      // Will make connections of each button to it's respective slot.
      void InitializeConnections();

    private :
      QPushButton *mAmputationButton;
      QPushButton *mAsthmaButton;
    //.. so on
};

MainWindow.cpp

#include <QPushButton>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
mAmputationButton(new QPushButton("Amputation") ),
mAsthmaButton(new QPushButton("Asthama") )
{
   InitializeConnections();
}

void MainWindow::InitializeConnections()
{
   connect(mAmputationButton, &QPushButton::clicked, this, &MainWindow::amputation_slot );
   connect(mAsthmaButton, &QPushButton::clicked, this, &MainWindow::asthma_slot );
  // same way for others.
}

我提到的插槽只是例如,將其連接到您需要連接的插槽。

更新 :

這是僅使用兩個按鈕進行的​​小型實現:

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
   
class QPushButton;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    QPushButton *mAmputationButton;
    QPushButton *mAsthmaButton;

private slots:
    void on_pushButton_clicked();

};

主窗口文件

#include "MainWindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    mAmputationButton( new QPushButton("Amputation" ) ),
    mAsthmaButton( new QPushButton("Astham" ) )
{
    setWindowTitle("First Aid");

    QWidget *sampleWidget = new QWidget();
    QVBoxLayout *lay = new QVBoxLayout();
    lay->addWidget(mAmputationButton);
    connect(mAmputationButton, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked );
    connect(mAsthmaButton, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked );
    lay->addWidget(mAsthmaButton);
    sampleWidget->setLayout(lay);
    setCentralWidget(sampleWidget);
}

MainWindow::~MainWindow(){}

void MainWindow::on_pushButton_clicked(){
    QDialog *sampleDialog = new QDialog();
    sampleDialog->setModal(true);
    sampleDialog->show();
}

注意1:在槽on_pushbutton_clicked ,我只是創建一個新對話框並顯示它。 只需在那里添加您的插槽邏輯,您就可以開始了。

注意2:建議將所有連接都放在一個方法中,例如上面已經提到的Initialize Connections

以這個小型實現為例,您可以在它之上工作,而不是復制粘貼使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM