• 9874阅读
  • 11回复

[提问]【求助】 怎么让弹出的Dialog 做成数字软键盘 [复制链接]

上一主题 下一主题
离线neil-wen
 

只看楼主 倒序阅读 楼主  发表于: 2013-04-25

刚学Qt不久,请求大侠帮助~~
双击弹出的Dialog是空白的,怎让它变成数字软盘,   放 按钮 、label  和 编辑框 在Dialog上    



  在Line Edits窗口关联的.cpp中当我双击 lineEdit 时,调用openDialog函数,并在openDialog函数里面放上GroupBox等控件,如下图      但是出来还是空白的Dialog ,不知道怎么把GroupBox等控件放上去?

离线cai6811376

只看该作者 1楼 发表于: 2013-04-25
用一个布局把echoGroup添加进dialog里面
离线neil-wen

只看该作者 2楼 发表于: 2013-04-25
引用第1楼cai6811376于2013-04-25 16:28发表的  :
用一个布局把echoGroup添加进dialog里面


谢谢
我试过了 不行  不知道是方法错误有错?
怎么添加的  ,麻烦大侠动动指头    来点代码说明一下啦
离线neil-wen

只看该作者 3楼 发表于: 2013-04-25
    QDialog dialog(this);    
dialog.resize(400, 400);  
  QGroupBox *echoGroup = new QGroupBox(tr("Echo"));    
QLabel *echoLabel = new QLabel(tr("Mode:"));
    QComboBox *echoComboBox = new QComboBox;  
echoComboBox->addItem(tr("Normal"));
    echoComboBox->addItem(tr("Password"));  
echoComboBox->addItem(tr("PasswordEchoOnEdit"));
   echoComboBox->addItem(tr("No Echo"));  
QLineEdit *echoLineEdit = new QLineEdit;  
  echoLineEdit->setFocus();  
  QGridLayout *echoLayout = new QGridLayout;  
  echoLayout->addWidget(echoLabel, 0, 0);  
echoLayout->addWidget(echoComboBox, 0, 1);  
  echoLayout->addWidget(echoLineEdit, 1, 0, 1, 2);  
      dialog.setLayout(echoLayout);      
  dialog.exec(); // 打开对话框

谢谢大家
问题解决了

问题出在     少了上面代码的红色字体

离线neil-wen

只看该作者 4楼 发表于: 2013-04-25


大侠们,还有几个问题,
1、双击出来的Dialog,不知道怎么点击数字键盘,把数值输入到Dialog的lineEdit去   (09是自己写上去的)?
   代码如下:
void limit_parameter::openDialog(int flag)
{
    QDialog dialog(this);
    dialog.resize(400, 260); //确定对话框的窗口大小
    dialog.move(270,120);   //确定对话框的位置

    QGroupBox *echoGroup = new QGroupBox(tr(""));
    dialog.setStyleSheet("font: 14pt;");

    switch(flag)
    {
     case 1:
           // echoGroup->setTitle(tr("电力系统频率偏差限值:0.1HZ~5.0HZ"));
            echoGroup->setTitle(tr("0.1HZ~5.0HZ"));

            break;
    case 2:
            echoGroup->setTitle(tr("电力系统频率偏差限值:-0.1HZ~-5.0HZ"));
            dialog.move(380,120);
            break;
    }

    QLineEdit *dataEdit = new QLineEdit;
    QPushButton *btn0 = new QPushButton(tr("0"));
    QPushButton *btn1 = new QPushButton(tr("1"));
    QPushButton *btn2 = new QPushButton(tr("2"));
    QPushButton *btn3 = new QPushButton(tr("3"));
    QPushButton *btn4 = new QPushButton(tr("4"));
    QPushButton *btn5 = new QPushButton(tr("5"));
    QPushButton *btn6 = new QPushButton(tr("6"));
    QPushButton *btn7 = new QPushButton(tr("7"));
    QPushButton *btn8 = new QPushButton(tr("8"));
    QPushButton *btn9 = new QPushButton(tr("9"));
    QPushButton *btnDot = new QPushButton(tr("."));
    QPushButton *btn_ = new QPushButton(tr("-"));
    QPushButton *btnClean = new QPushButton(tr("Clean"));
    QPushButton *btnDel = new QPushButton(tr("Del"));
    QPushButton *btnEnter = new QPushButton(tr("Enter"));
    QPushButton *btnback = new QPushButton(tr("返回"));

    connect(btn0, SIGNAL(clicked()),this, SLOT(btn0_data()));        //问题: this是指向 limit_parameter  窗口的,  不知道怎么点击“0“键时,
  //  connect(btn1, SIGNAL(clicked()),this, SLOT(btn1_data()));      //让本Dialog的创口的dataEdit(lineEdit控件)的值发生变化?
  //  connect(btn2, SIGNAL(clicked()),this, SLOT(btn2_data()));      //有什么连接槽的方式可以实现

     dataEdit->setText(tr("09"));

    //按钮排版
    QGridLayout *num1 = new QGridLayout;
    num1->addWidget(btn1,0,0);
    num1->addWidget(btn2,0,1);
    num1->addWidget(btn3,0,2);
    num1->addWidget(btn4,0,3);
    num1->addWidget(btn5,0,4);
    num1->addWidget(btnDot,0,5);
    num1->addWidget(btn6,1,0);
    num1->addWidget(btn7,1,1);
    num1->addWidget(btn8,1,2);
    num1->addWidget(btn9,1,3);
    num1->addWidget(btn0,1,4);
    num1->addWidget(btn_,1,5);

    QHBoxLayout *num2 = new QHBoxLayout;   //排好按钮的位置
    num2->addWidget(btnClean);
    num2->addWidget(btnDel);
    num2->addWidget(btnEnter);

    QHBoxLayout *num3 = new QHBoxLayout;
    num3->addWidget(btnback);
    num3->addStretch();

    QGridLayout *main1 =new QGridLayout;
    main1->addWidget(dataEdit,0,0);
    main1->addLayout(num1,1,0);
    main1->addLayout(num2,2,0);
    echoGroup->setLayout(main1);

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(echoGroup,0,0);
    layout->addLayout(num3,1,0);

    dialog.setLayout(layout);

    dialog.exec(); // 打开对话框
}

void limit_parameter::btn0_data()   //Dialog外面的函数
{  
int aa;  
aa=flag;  
switch(aa)
{
   case 1:  
   //ui->JustDeviation->insert(tr("0"));
   dialog->dataEdit->insert(tr("0"));           //问题:编译的时候就发现不了 这个dialog  了
   break;
}  
}




2、当点击 Dialog中的"Enter键"时,怎么把Dialog的dataEdit的数据  传到 Line Edites 的 lineEdit  中
离线btptboy

只看该作者 5楼 发表于: 2013-04-26
lz这样做是不明智的,应该写一个类继承QDialog类,双击时再将自定义的dialog对象显示出来,这样按钮的点击都在自定义的dialog类中实现,只要dialog类中的dataEdit的text改变时,发射一个信号,将dataEdit中的text发射出来,Line Edits窗体接收信号进行处理就可以了

另,lz代码中的dialog是openDialog中的一个局部变量,在btn0_data中当然是找不到的,
处理dialog的按钮事件也不必针对每一个按钮写一个慒,可以只写一个慒,如btn_data(),将所有的按钮的clicked信号连到这个慒上,慒函数可以这样处理:
void limit_parameter::btn_data()
{  
QObject *obj = sender();
QPushButton *button = dynamic_cast<QPushButton*>(obj);
button->text();  // 这里可以得到按钮上的文字
}
我思故我在
离线neil-wen

只看该作者 6楼 发表于: 2013-04-26
引用第5楼btptboy于2013-04-26 09:36发表的  :
lz这样做是不明智的,应该写一个类继承QDialog类,双击时再将自定义的dialog对象显示出来,这样按钮的点击都在自定义的dialog类中实现,只要dialog类中的dataEdit的text改变时,发射一个信号,将dataEdit中的text发射出来,Line Edits窗体接收信号进行处理就可以了
另,lz代码中的dialog是openDialog中的一个局部变量,在btn0_data中当然是找不到的,
处理dialog的按钮事件也不必针对每一个按钮写一个慒,可以只写一个慒,如btn_data(),将所有的按钮的clicked信号连到这个慒上,慒函数可以这样处理:
void limit_parameter::btn_data()
.......


恩恩,大侠有很好思路,减了不少代码  
请问第二个问题,“当点击 Dialog中的"Enter键"时,怎么把Dialog的dataEdit的数据  传到 Line Edites窗口 的 lineEdit  中”怎么解决,
或者,两个.UI(两个都用“Qt设计界面”弄的界面,两个都是Widget型)文件     当点击“enter键时”  怎么把上面窗口的lineEdit数字传到下面窗口的lineEdit中去?
好想快点解决~~~~
这类问题困扰我好几天了

离线btptboy

只看该作者 7楼 发表于: 2013-04-26
回 6楼(neil-wen) 的帖子
你的这个问题我已经回答了,你应该在自定义的哪个dialog类中定一个信号,如:
signal:
void textChanged(QString);
当点击enter键时,在对应的慒函数中执行:emit textChanged(ui->dataEdit->text());
这样,你只需要在双击所对应的慒函数中,在dialog被exec之前
connect(dialog, SIGNAL(textChanged(QString)), this, SLOT(mySlot(QString)); // this为line edits窗体
慒函数如下:
void mySlot(QString str)
{
    // 设置line edits窗体中的lineedit的text为str
}

你甚至可以在自定义的dialog类中
connect(ui->dataedit, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged(QString))
这样你连enter按钮都可以不需要了
我思故我在
离线neil-wen

只看该作者 8楼 发表于: 2013-04-26
Re:回 6楼(neil-wen) 的帖子
引用第7楼btptboy于2013-04-26 16:31发表的 回 6楼(neil-wen) 的帖子 :
你的这个问题我已经回答了,你应该在自定义的哪个dialog类中定一个信号,如:
signal:
void textChanged(QString);
当点击enter键时,在对应的慒函数中执行:emit textChanged(ui->dataEdit->text());
这样,你只需要在双击所对应的慒函数中,在dialog被exec之前
.......

谢谢大侠,按照您的方法解决了  谢谢  真厉害
离线angel0007

只看该作者 9楼 发表于: 2014-03-20
这个要马克
hallo
离线s924987866

只看该作者 10楼 发表于: 2014-04-21
马克
离线venusjoy

只看该作者 11楼 发表于: 2015-06-08
回 btptboy 的帖子
btptboy:你的这个问题我已经回答了,你应该在自定义的哪个dialog类中定一个信号,如:
signal:
void textChanged(QString);
当点击enter键时,在对应的慒函数中执行:emit textChanged(ui->dataEdit->text());
这样,你只需要在双击所对应的慒函数中,在dialog被exec之前
....... (2013-04-26 16:31) 

非常好
快速回复
限100 字节
 
上一个 下一个