当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : QT设置同一个Ui下不同Widgets的信号连接
帖子发表于 : 2015-04-04 10:20 

注册: 2015-04-03 8:48
帖子: 9
系统: ubuntu 14.04
送出感谢: 2
接收感谢: 0 次
我的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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: QT设置同一个Ui下不同Widgets的信号连接
帖子发表于 : 2015-04-04 14:18 
头像

注册: 2008-09-18 13:11
帖子: 2797
送出感谢: 1
接收感谢: 458
原因是你根本没有把echocont声明为槽函数,它是在public而非public slots。你在QtCreator里运行一下应该就会提示QObject::connect: No such slot MainWindow::echocont()

另外既然你用了个带参数的信号,就直接用带参数的槽函数来接收不就完了,还弄个私有成员变量来中转一道



_________________
评价: 3.7% littleshuaishuai
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: QT设置同一个Ui下不同Widgets的信号连接
帖子发表于 : 2015-04-04 23:24 

注册: 2015-04-03 8:48
帖子: 9
系统: ubuntu 14.04
送出感谢: 2
接收感谢: 0 次
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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: QT设置同一个Ui下不同Widgets的信号连接
帖子发表于 : 2015-04-07 10:12 
头像

注册: 2008-09-18 13:11
帖子: 2797
送出感谢: 1
接收感谢: 458
管输出的代码是在echocont里,对echocont的调用是通过textChange信号,负责发射textChang信号的是sendcont。但在你贴的代码里没有一处调用了sendcont。
自己学着下断点调试一下,这种流程上的问题很容易查出来的


页首
 用户资料  
 
5 楼 
 文章标题 : Re: QT设置同一个Ui下不同Widgets的信号连接
帖子发表于 : 2015-04-08 7:52 

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


非常感谢您,我之前换了一种方法,使用lineEdit和TextEdit自己的signals和slots,实现了这个功能。不过我有时间还会研究一下这段代码的问题。 :em11


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译