QT设置同一个Ui下不同Widgets的信号连接

开发基于GTK+或QT的应用程序
回复
littleshuaishuai
帖子: 9
注册时间: 2015-04-03 8:48
系统: ubuntu 14.04
送出感谢: 2 次
接收感谢: 0

QT设置同一个Ui下不同Widgets的信号连接

#1

帖子 littleshuaishuai » 2015-04-04 10:20

我的ui如下,一共有三个widgets,LineEdit、SpainTextEdit、TextEdit,分别为上中下如图所示图片
我希望实现一个功能,在your input中输入的字符能够在Candidates中即时显现出来,一开始想创建一个新的线程,但是新的线程无法调用主线程的GUI(不可重入),所以考虑信号槽机制,代码如下:

代码: 全选

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    Ui::MainWindow* getUi();
    void sendcont();
    void echocont();

    ~MainWindow();
signals:
    void textChange(const QString & name)const;
protected:
    bool eventFilter(QObject *obj,QEvent *even);
private:
    Ui::MainWindow *ui;
    QTextEdit *a;
    QLineEdit *b;
    QString str;
    QString str1;
};

代码: 全选

void MainWindow::sendcont()
{
    str1 = str;
   emit textChange(str1);
}
void MainWindow::echocont()
{
    ui->plainTextEdit->setPlainText(str1);
}
main:

代码: 全选

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    QObject::connect(&w,&MainWindow::textChange,&w,&MainWindow::echocont);
    w.show();


    return a.exec();
}
可是运行之后功能未能实现,请教各位这个问题的原因,并且如何改进,可以至告诉我思路,我自己去修改代码。
谢谢。 :em01 [/size]
头像
astolia
论坛版主
帖子: 3084
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 510 次

Re: QT设置同一个Ui下不同Widgets的信号连接

#2

帖子 astolia » 2015-04-04 14:18

原因是你根本没有把echocont声明为槽函数,它是在public而非public slots。你在QtCreator里运行一下应该就会提示QObject::connect: No such slot MainWindow::echocont()

另外既然你用了个带参数的信号,就直接用带参数的槽函数来接收不就完了,还弄个私有成员变量来中转一道
这些用户感谢了作者 astolia 于这个帖子:
littleshuaishuai (2015-04-04 23:26)
评价: 3.7%
littleshuaishuai
帖子: 9
注册时间: 2015-04-03 8:48
系统: ubuntu 14.04
送出感谢: 2 次
接收感谢: 0

Re: QT设置同一个Ui下不同Widgets的信号连接

#3

帖子 littleshuaishuai » 2015-04-04 23:24

astolia 写了:原因是你根本没有把echocont声明为槽函数,它是在public而非public slots。你在QtCreator里运行一下应该就会提示QObject::connect: No such slot MainWindow::echocont()

另外既然你用了个带参数的信号,就直接用带参数的槽函数来接收不就完了,还弄个私有成员变量来中转一道
嗯,按照您的指点进行了修改,可是还是存在一定问题:
mainwindow.h文件:

代码: 全选

signals:
    void textChange(const QString & name)const;
protected:
    bool eventFilter(QObject *obj,QEvent *even);
private:
    Ui::MainWindow *ui;
    QTextEdit *a;
    QLineEdit *b;
    QString str;
    bool ischanged;
public slots :
    void echocont();
mainwindow.cpp文件:

代码: 全选

bool MainWindow::eventFilter(QObject *obj, QEvent *even)
{
    if(even->type()==QEvent::KeyPress)
    {
        ischanged = true;
        QKeyEvent *event = static_cast<QKeyEvent*>(even);
        QString qst;
        if(!iswhite(event))
        {
            str += event->text();
            ui->textEdit->setText(str);
        }
        else
        {
            switch(event->key())
            {
            case Qt::Key_Enter:
            {
                QString tmp="";str=str+(tmp+='\n');
                ui->textEdit->setText(str);break;
            }
            case Qt::Key_Space:
            {
                QString tmp=" ";str=str+tmp;
                ui->textEdit->setText(str);break;
            }
            case Qt::Key_Backspace:
            {
                str=str.mid(0,str.length()-1);
                ui->textEdit->setText(str);break;
            }
            case Qt::Key_Tab:
            {
                str = str+"  ";
                ui->textEdit->setText(str);break;
            }
            default:
                break;
            }
        }
        return true;
    }
    else
    {
        return QObject::eventFilter(obj,even);
    }
}
void MainWindow::sendcont()
{
    if(ischanged)//布尔型变量,键盘如果读入字符,则原字符串改变,赋值为true
        emit textChange(str);
}
void MainWindow::echocont()
{
    ui->lineEdit_2->setText(str);
}
main函数:

代码: 全选

    QApplication a(argc, argv);
    MainWindow w;
    QObject::connect(&w,&MainWindow::textChange,&w,&MainWindow::echocont);
    w.show();
    return a.exec();
还是无法同时在candidate栏中输出,之所以费这样一回事是将来会在candidate这一栏加入“中文候选字”,以逐步实现输入法的功能。
:em01
头像
astolia
论坛版主
帖子: 3084
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 510 次

Re: QT设置同一个Ui下不同Widgets的信号连接

#4

帖子 astolia » 2015-04-07 10:12

管输出的代码是在echocont里,对echocont的调用是通过textChange信号,负责发射textChang信号的是sendcont。但在你贴的代码里没有一处调用了sendcont。
自己学着下断点调试一下,这种流程上的问题很容易查出来的
littleshuaishuai
帖子: 9
注册时间: 2015-04-03 8:48
系统: ubuntu 14.04
送出感谢: 2 次
接收感谢: 0

Re: QT设置同一个Ui下不同Widgets的信号连接

#5

帖子 littleshuaishuai » 2015-04-08 7:52

astolia 写了:管输出的代码是在echocont里,对echocont的调用是通过textChange信号,负责发射textChang信号的是sendcont。但在你贴的代码里没有一处调用了sendcont。
自己学着下断点调试一下,这种流程上的问题很容易查出来的
非常感谢您,我之前换了一种方法,使用lineEdit和TextEdit自己的signals和slots,实现了这个功能。不过我有时间还会研究一下这段代码的问题。 :em11
回复

回到 “GTK+和QT”