Нажатие кнопки QT для изменения текста

Я совершенно новичок в QT. Я написал небольшую форму с 4-мя переключателями, кнопкой нажатия и полем редактирования простого текста (в QT Creator). Моя цель состоит в том, чтобы нажать кнопку и получить текстовое изменение в открытом тексте («Немного текста здесь»). К сожалению, я не могу найти правильную формулу для соединения кнопки и текстового поля, поэтому я получаю сообщение об ошибке, но пока не могу понять. Вот код (я опускаю часть XML с графическим интерфейсом):

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QRadioButton>
#include <QPushButton>
#include <QPlainTextEdit>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

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

public slots:
void on_pushButton_clicked();

private:
Ui::MainWindow *ui;
QRadioButton radioButton,radioButton_2,radioButton_3,radioButton_4;
QPushButton pushButton;
QPlainTextEdit plainTextEdit;
};

#endif // MAINWINDOW_H

main.cpp:

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

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

return a.exec();
}

mainwindow.cpp:

#include "mainwindow.h"#include "ui_mainwindow.h"//#include <QPushButton>
//#include <QPlainTextEdit>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QObject::connect(pushButton,SIGNAL(clicked()),plainTextEdit,SLOT(on_pushButton_clicked()));
}

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

void MainWindow::on_pushButton_clicked()
{
plainTextEdit.setPlainText("Some text here");
}

Вот вывод ошибки:

/home/user/workspace/ButtonRadio/mainwindow.cpp:-1: In constructor 'MainWindow::MainWindow(QWidget*)':
/home/user/workspace/ButtonRadio/mainwindow.cpp:11: error: no matching function for call to 'MainWindow::connect(QPushButton&, const char*, QPlainTextEdit&, const char*)'
/home/user/workspace/ButtonRadio/mainwindow.cpp:11: candidates are:
/usr/include/qt4/QtCore/qobject.h:204: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204: note:   no known conversion for argument 1 from 'QPushButton' to 'const QObject*'
/usr/include/qt4/QtCore/qobject.h:217: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217: note:   no known conversion for argument 1 from 'QPushButton' to 'const QObject*'
/usr/include/qt4/QtCore/qobject.h:337: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337: note:   no known conversion for argument 1 from 'QPushButton' to 'const QObject*'

Если я просто напишу

QObject::connect(pushButton,SIGNAL(clicked()),SLOT(on_pushButton_clicked()));

затем вывод ошибок немного меняется, но суть остается прежней. Как я могу решить эту проблему?

—EDIT — 15.11.14—

mainwindow.h:

private:
Ui::MainWindow *ui;
QRadioButton *radioButton,*radioButton_2,*radioButton_3,*radioButton_4;
QPushButton *pushButton;
QPlainTextEdit *plainTextEdit;
};

mainwindow.cpp:

#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
pushButton(new QPushButton(this)),
plainTextEdit(new QPlainTextEdit(this))
{
ui->setupUi(this);
//pushButton = new QPushButton(this);
//plainTextEdit = new QPlainTextEdit(this);
QObject::connect(pushButton,SIGNAL(clicked()),plainTextEdit,SLOT(on_pushButton_clicked()));
}

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

void MainWindow::on_pushButton_clicked()
{
plainTextEdit->setPlainText("Some text here");
}

В результате я получаю SIGSEGV со следующим выводом:

amember "1on_pushButton_clicked()" char *
asender @0x2 QObject
asignal "2clicked()" char *
atype Qt::AutoConnection(0) Qt::ConnectionType
this @0x7fffffffe640 QObject

Он также указывает на следующие строки в qobject.h:

339 { return connect(asender, asignal, this, amember, atype); }
349 T qFindChild(const QObject *o, const QString &name = QString());
350 QList<T> qFindChildren(const QObject *oobj, const QString &name = QString());
351 QList<T> qFindChildren(const QObject *o, const QRegExp &re);

1

Решение

Вы получаете эту ошибку, потому что connect используйте указатели. Вы должны использовать указатели:

QRadioButton *radioButton,*radioButton_2,*radioButton_3,*radioButton_4;
QPushButton *pushButton;
QPlainTextEdit *plainTextEdit;

Когда вы используете указатель каждый . заменить ->, Компилятор сообщает вам об ошибке со следующей ошибкой:

...(maybe you meant to use '->' ?) radioButton_2.show();

И подключать надо:

connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

или же

connect(pushButton,SIGNAL(clicked()),SLOT(on_pushButton_clicked()));

На будущее: вы также можете написать это:

QObject obj1;
QObject obj2;
connect(&obj1,SIGNAL(someSigna()),&obj2,SLOT(slot()));

Как видите, вам нужно &

Вам нужно написать QObject::connect в не QObject подклассы (например, в main.cpp) В вашем MainWindow ты можешь написать просто connect

Также, когда вы используете указатели, вы должны выделить память new, Например:

pushButton = new QPushButton(this);//in constructor
//and so on

где this показывает нам, что this (наш MainWindow) является родителем, поэтому pushButton появится в MainWindow, а не в отдельном окне.

Я думаю, что упомянул все большие ошибки в этом коде.

on_pushButton_clicked() это слот главного окна, а не обычный текст:

pushButton = new QPushButton(this);
plainTextEdit = new QPlainTextEdit(this);
connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
0

Другие решения


По вопросам рекламы [email protected]