Ошибка при подключении сигнала QPushButton :: clicked к слоту - PullRequest
0 голосов
/ 31 мая 2018

Прежде всего, я создал около 20 кнопок, используя цикл.И назвал их, используя цикл if else.Теперь я хочу соединить каждую кнопку с новым диалоговым окном.Если бы я использовал режим конструирования QT, он показывал бы название кнопки, когда я нажимал connect(ui->pushButton_0, SIGNAl(released()), SLOT(digit_pressed()) примерно такНо я не знаю название кнопки, которую я сделал в качестве цикла for и if else.connect(ui-> .......) также не показывает никаких прогнозов.Как связать эти кнопки и новое диалоговое окно?

Вот мой код:

mainwindow.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

mainwindow.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().Но это была просто попытка.**

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Как и в программировании, все готовится :), давайте посмотрим, что является составляющими connect():

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

, поэтому отправитель будет buttons, сигнал - clicked,сам приемник, то есть this, и слот on_pushButton_clicked

Я вижу ненужное, если-либо, все может быть уменьшено до:

#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();
}

Примечание:

избегайте использования старого стиля подключения, имеет много недостатков, прочитайте содержание следующей ссылки для получения дополнительной информации:

0 голосов
/ 31 мая 2018
  1. Сделайте все эти QPushButton члены класса такими, чтобы они создавались и уничтожались должным образом, а не создавали их в цикле.

  2. Как только вы получитекаждый в качестве отдельного члена, затем используйте метод InitializeConnections() и создайте все соединения под ним, используя синтаксис Qt connect.

Если вы считаете, что эти кнопки являются частью MainWindow class, тогда ваш класс может выглядеть примерно так:

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.
}

Слоты, которые я упомянул, приведены, например, только для подключения их кслот, к которому он должен быть подключен.

ОБНОВЛЕНИЕ:

Вот мини-реализация, выполненная с использованием всего двух кнопок:

MainWindow.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();

};

MainWindow.cpp

#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, как уже упоминалось выше..

Возьмите эту мини-реализацию просто как пример, над которым вы можете работать, а не использовать ее для копирования-вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...