Qt 我怎样才能称之为;“按钮”;在main.cpp中?

Qt 我怎样才能称之为;“按钮”;在main.cpp中?,qt,Qt,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();

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

#endif // MAINWINDOW_H
main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QObject::connect(pushButton, SIGNAL(clicked()),
            &a, SLOT(quit()));

    return a.exec();
}
你能给我一个解决方案吗?我如何在main.cpp中调用它? 谢谢

补充1

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

MainWindow::~MainWindow()
{
    delete ui;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    QObject::connect(ui->pushButton, SIGNAL(clicked()),
            QCoreApplication::instance(), SLOT(close()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    close();
}
如果我这样做,那么程序可以运行,但不能关闭整个应用程序。我猜这是因为QCoreApplication::instance()返回null,因为在构造函数阶段,QApplication不存在,对吗

补充2

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

MainWindow::~MainWindow()
{
    delete ui;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    QObject::connect(ui->pushButton, SIGNAL(clicked()),
            QCoreApplication::instance(), SLOT(close()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    close();
}
一种解决方案是在mainwindow.cpp中添加按钮的新插槽,如上所述。 但我还是希望知道如何用我的方式去做(这篇文章的主要部分)

补充3:

Alberto的代码通过如下方式使用QWidget运行良好

ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(close()));

第一种方法无法工作,因为正如编译器所说,您没有在main.cpp范围中定义QPushButton。所以编译器找不到它

正确的方法是你最后的方法。你开发了一个.UI文件,其中添加了一个QPutStudio,然后在C++代码中处理你的.UI文件(在你的例子中是一个QualWindows子类),你将它与一个插槽连接起来。但是你的转接电话错了。这是我的代码:

//widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

//widget.cpp:
#include "widget.h"
#include "ui_widget.h"

#include <QtGui>

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(close()));
}


//widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>93</width>
    <height>41</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>


//main.cpp:
#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
//widget.h:
#ifndef小部件
#定义小部件
#包括
名称空间用户界面{
类控件;
}
类Widget:publicqwidget
{
Q_对象
公众:
显式小部件(QWidget*parent=0);
~Widget();
私人:
Ui::Widget*Ui;
};
#endif//WIDGET\u H
//widget.cpp:
#包括“widget.h”
#包括“ui_widget.h”
#包括
小部件::~Widget()
{
删除用户界面;
}
Widget::Widget(QWidget*父项):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
连接(ui->按钮,信号(点击()),此,插槽(关闭());
}
//widget.ui:
小装置
0
0
93
41
小装置
按钮
//main.cpp:
#包括
#包括“widget.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
小部件w;
w、 show();
返回a.exec();
}
使用:连接(ui->按钮、信号(单击())、此、插槽(关闭()); 我们可以这样简化:连接(1,2,3,4)

当由于用户在1上执行某些操作而发出2时,请在3上执行4


翻译:当用户单击按钮(定义到ui文件中)时,请关闭此按钮(QMainWindow子类)。如果您查看main.cpp代码,MainWindow是您向用户显示的主要小部件。所以你要关闭整个应用程序

第一种方法无法工作,因为正如编译器所说,您没有在main.cpp范围内定义QPushButton。所以编译器找不到它

正确的方法是你最后的方法。你开发了一个.UI文件,其中添加了一个QPutStudio,然后在C++代码中处理你的.UI文件(在你的例子中是一个QualWindows子类),你将它与一个插槽连接起来。但是你的转接电话错了。这是我的代码:

//widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

//widget.cpp:
#include "widget.h"
#include "ui_widget.h"

#include <QtGui>

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(close()));
}


//widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>93</width>
    <height>41</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>


//main.cpp:
#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
//widget.h:
#ifndef小部件
#定义小部件
#包括
名称空间用户界面{
类控件;
}
类Widget:publicqwidget
{
Q_对象
公众:
显式小部件(QWidget*parent=0);
~Widget();
私人:
Ui::Widget*Ui;
};
#endif//WIDGET\u H
//widget.cpp:
#包括“widget.h”
#包括“ui_widget.h”
#包括
小部件::~Widget()
{
删除用户界面;
}
Widget::Widget(QWidget*父项):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
连接(ui->按钮,信号(点击()),此,插槽(关闭());
}
//widget.ui:
小装置
0
0
93
41
小装置
按钮
//main.cpp:
#包括
#包括“widget.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
小部件w;
w、 show();
返回a.exec();
}
使用:连接(ui->按钮、信号(单击())、此、插槽(关闭()); 我们可以这样简化:连接(1,2,3,4)

当由于用户在1上执行某些操作而发出2时,请在3上执行4


翻译:当用户单击按钮(定义到ui文件中)时,请关闭此按钮(QMainWindow子类)。如果您查看main.cpp代码,MainWindow是您向用户显示的主要小部件。所以你要关闭整个应用程序

你为什么这么急着要在main.cpp中调用它?那怎么办?我需要退出整个应用程序,但指向整个应用程序的“a”位于main.cpp中,因此我将代码放在其中。您可以通过调用静态QCoreApplication::instance()函数,从代码中的任意位置检索指向当前Q(核心)应用程序的指针。谢谢您的回答!请查看我上面的主要帖子,补充1部分。为什么要连接到“关闭”插槽?QCoreApp没有这个功能。你要找的是“退出”的位置。()为什么你这么急着要在main.cpp中调用它?那怎么办?我需要退出整个应用程序,但指向整个应用程序的“a”位于main.cpp中,因此我将代码放在其中。您可以通过调用静态QCoreApplication::instance()函数,从代码中的任意位置检索指向当前Q(核心)应用程序的指针。谢谢您的回答!请查看我上面的主要帖子,补充1部分。为什么要连接到“关闭”插槽?QCoreApp没有这个功能。你要找的是“退出”的位置。我测试了你的代码,效果很好。但是我的和你的非常相似,但它的工作方式不同!我注意到区别在于您使用QWidget,我使用QMainWindow.QMainWindow和QWidget的工作方式相同。所以没关系。也许你添加/删除了其他内容。您可以尝试使用我的代码并添加QMainWindow而不是QWidget。如果你不能解决,请告诉我们。对不起。我要求更新它。后来我又做了一次试验,那次对QWidget和QMainWindow都很好。非常感谢。别担心。它必须工作,因为QMainWindow继承了QWidget。我忘了提了。我测试了你的代码,效果很好。但是我的和你的非常相似,但它的工作方式不同!我注意到区别在于您使用QWidg