Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt:信号、插槽和Q_对象_Qt_Qpushbutton - Fatal编程技术网

Qt:信号、插槽和Q_对象

Qt:信号、插槽和Q_对象,qt,qpushbutton,Qt,Qpushbutton,我已经用Qt写了一个程序,它工作得很好,但是点击按钮不起作用。 当我在类声明之后使用Q_对象时,它会给我编译错误 这是我的密码: #include <QApplication> #include <QPushButton> #include <QLabel> #include <QWidget> class Communicate : public QWidget { // Q_OBJEC

我已经用Qt写了一个程序,它工作得很好,但是点击按钮不起作用。 当我在类声明之后使用Q_对象时,它会给我编译错误

这是我的密码:

    #include <QApplication>
    #include <QPushButton>
    #include <QLabel>
    #include <QWidget>

    class Communicate : public QWidget
    {
     // Q_OBJECT

      public:
        Communicate(QWidget *parent = 0);

      private slots:
        void OnPlus();
        void OnMinus();

      private:
        QLabel *label;

    };

    Communicate::Communicate(QWidget *parent)
        : QWidget(parent)
    {
      QPushButton *plus = new QPushButton("+", this);
      plus->setGeometry(50, 40, 75, 30);

      QPushButton *minus = new QPushButton("-", this);
      minus->setGeometry(50, 100, 75, 30);

      label = new QLabel("0", this);
      label->setGeometry(190, 80, 20, 30);

      connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus()));
      connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus()));
    }

    void Communicate::OnPlus()
    {
      int val = label->text().toInt();
      val++;
      label->setText(QString::number(val));
    }

    void Communicate::OnMinus()
    {
      int val = label->text().toInt();
      val--;
      label->setText(QString::number(val));
    }

    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);

      Communicate window;

      window.setWindowTitle("Communicate");
      window.show();

      return app.exec();
    }
#包括
#包括
#包括
#包括
类通信:公共QWidget
{
//Q_对象
公众:
通信(QWidget*parent=0);
专用插槽:
void OnPlus();
在分钟内无效();
私人:
QLabel*标签;
};
通信::通信(QWidget*父)
:QWidget(父项)
{
QPushButton*plus=新的QPushButton(“+”,这个);
plus->setGeometry(50,40,75,30);
QPushButton*减号=新的QPushButton(“-”,this);
减->设置几何体(50,100,75,30);
标签=新的QLabel(“0”,此);
标签->设置几何体(190、80、20、30);
连接(plus,信号(clicked()),此,插槽(OnPlus());
连接(减号,信号(点击()),这个,插槽(OnMinus());
}
void Communicate::OnPlus()
{
int val=label->text().toInt();
val++;
label->setText(QString::number(val));
}
void Communicate::OnMinus()
{
int val=label->text().toInt();
瓦尔--;
label->setText(QString::number(val));
}
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
沟通窗口;
window.setWindowTitle(“通信”);
window.show();
返回app.exec();
}

使用O_QBJECT宏,要更正出现的错误,您可以:

1) 在自己的.h文件中声明QWidget/QObject派生类,并在自己的.cpp文件中定义它

2) 将moc在类定义后生成的.moc文件包含在您拥有的.cpp中(添加类似于#include“xxxx.moc”的内容)


LE:此外,您还希望使用布局而不是使用setGeometry将小部件放置到窗口中,阅读更多内容

您需要通过moc运行包含Q_对象宏的文件,并编译它的输出并将其与其他应用程序链接在一起。根据您的构建系统,这会自动发生(qmake)或通过添加一行左右(cmake)

当我使用单独的.h和.cpp文件时,我发现它运行正常,事实上,这是我在系统上运行的一个教程代码,告诉我要创建单独的文件。我为自己修改了,想知道为什么会发生这种情况,为什么我们不能在main.cpp中编写所有内容??另外,我不理解你的第二个方法,MOC?MOC是一个Qt工具,它为QObjo派生类功能生成C++代码,比如:信号和槽。不管怎样,推荐的方法是第一个,不要忽略使用布局的建议,而不是手动设置小部件在父位置上的位置。为什么我们不能在Mead中编写所有的内容?CPP??可以,但是然后你必须包括“Meal.Moc”***(这样C++编译器就可以看到生成的东西)***的名字可能会有所不同,这可能取决于moc版本等(这是将h/cpp文件用于类并让工具完成其工作的另一个原因)