嗨,我是c ++的新手,并试图了解这些概念。 我正在创建一个非常简单的应用程序,以便在教程的帮助下继续前进,所以我试着做我自己的第一次尝试。 我遇到的问题是file.h和file.cpp除了main.cpp之外的问题 我想单击按钮框中的“确定”按钮,文本框中会出现文本。 这是MainWindow.h的第一个
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "ui_MainWindow.h"
class MainWindow: public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
MainWindow(QMainWindow *parent = 0);
private slots:
//here is where im tyring to add a slot.
void on_buttonbox_buttonClicked ( QAbstractButton * );
// void on_inputSpinBox2_valueChanged(int value);
private:
Ui::MainWindow ui;
};
#endif
接下来是MainWindow.cpp
#include <QtGui>
#include "MainWindow.h"
MainWindow::MainWindow(QMainWindow *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
//This is where i would like to catch the clicked signal from the ok button and add the text to the text box.
void MainWindow::on_buttonbox_buttonClicked ( QAbstractButton * ){
ui.textEdit->setText(QString::number(16));
}
我试图变得如此简单,只是为了让它继续下去,它会编译,但我无法得到信号和插槽谈话,我在哪里出错....记住全新。
答案 0 :(得分:1)
您必须将插槽连接到信号,将其添加到构造函数中:
this->connect(this->ui.yourButton, SIGNAL(clicked()), this, SLOT(on_buttonbox_buttonClicked(QAbstractButton*)));
// ^
// |
// The name of your Button here ...
另请参阅此处:http://qt-project.org/doc/qt-4.8/signalsandslots.html
修改强>
<强> MainWindow.cpp 强>
MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
{
ui.setupUi(this);
// Connect Signals-Slots
this->connect(this->ui.yourButton, SIGNAL(clicked()), this, SLOT(on_buttonbox_buttonClicked(QAbstractButton*)));
}
// ...
但不要忘记将yourButton
更改为您为自己命名的内容。
答案 1 :(得分:0)
好的,你必须将信号连接到插槽。你应该在构造函数
上执行此操作connect(按钮,SIGNAL(clicked()),this,SLOT(on_buttonbox_buttonClicked(QAbstractButton *)));
请记住,只有连接信号时才会调用插槽。否则你的按钮将无法知道去哪里。
答案 2 :(得分:0)
SIGNAL和SLOT的机制非常简单,用于将小部件(按钮,旋转框等)注册到事件。例如,“当我点击该按钮时,将显示一个新窗口。” 话虽如此,让我们看看我们如何在他的SIGNAL中注册我们的SLOT(接收信号后该怎么做)(一个事件:点击,选择,编辑表格等等)。
QObject::connect( button , SIGNAL( click()), this , SLOT( openWindow() ))
按钮是抛出信号的小部件。
SIGNAL(点击())您告知点击(按下并释放)按钮将执行某项操作
此是声明广告位的对象
SLOT(openWindow())是点击按钮
的方法(广告位)信号和插槽必须具有相同的参数!!
因此,要回答您的问题,您必须声明一个与信号具有相同参数的插槽。 click()
没有参数,因此您必须将广告位声明为:
void on_buttonbox_buttonClicked ()
PS:我记得在上命名一个前缀为的插槽时出现问题。但我必须做一些搜索,因为我记不太清楚。
更新我做了一点测试,并在_ 上使用前缀命名插槽,在运行时QMetaObject::connectSlotsByName: No matching signal for on_ClickChangeBack()
发出错误消息,但插槽执行。< / p>