2014-11-04 2 views
1

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

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); 
+0

QRadioButton * RadioButton, * radioButton_2, * radioButton_3, * radioButton_4; QPushButton * pushButton; QPlainTextEdit * plainTextEdit; , затем выделите память новыми –

ответ

0

Вы получаете эту ошибку, потому что 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() является слот MainWindow, а не plaintexteditTry следующая:

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

'* radioButton_2',' * radioButton_3', '* radioButton_4'. – coyotte508

+0

Спасибо! Извините за эту длинную задержку с моим комментарием. Я сделал то, что вы сказали - изменил переменные на указатели (вы были так правы!), Создал выделение для pushButton, изменил «.». на «->» в on_pushButton_clicked(), но в конце я получаю SIGSEGV Segmentation Fault. Не могу понять, как отправить код здесь в этом окне ответа ... – user1274925

+0

@ user1274925 Вы также выделили память для открытого текста? Если нет, попробуйте это сделать. Если это не поможет, нажмите «Изменить ваш ответ» и добавьте текущий код. – Chernobyl

Смежные вопросы