• 8265阅读
  • 2回复

几个小问题 [复制链接]

上一主题 下一主题
离线bienew
 

只看楼主 正序阅读 楼主  发表于: 2007-08-29
— 本帖被 XChinux 执行加亮操作(2007-08-31) —
从开始学习到使用Qt已经快一个月了,在实际开发中遇到一些小问题,希望大家能够不吝指教,谢谢
1、按键的功能自定义问题:如果我希望将按键"A“和"S“定义成"Tab和Backtab
这样做:class MyWidget : public QWidget()
              {...}
void MyWidget::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_A)
      {
              QKeyEvent *event1 = new QKeyEvent(QKeyEvent::KeyPress,Qt::Key_Tab,Qt::NoModifier);
              QApplication::sendEvent(this,event1);
      }
      else if(event->key == Qt::Key_C)
      {
                QKeyEvent *event2= new QKeyEvent(QKeyEvent::KeyPress,Qt::Key_Backtab,Qt::NoModifier);
                QApplication::sendEvent(this,event2);
      }
      else
                QWidget::keyPressEvent(event);
}
请问是否合理?谢谢
2、对于QFont
比如QLabel *label = new QLabel(tr("Test Label"));
        label->setFont(QFont("AnyStyle",12,QFont::normal));
我想知道的是,"AnyStyle"除了可以置换成QFont::StyleHint里的那些值外,怎么设置成中文的比如宋体什么的?特别在中英文切换的时候,怎么最优的切换整个应用程序的字体?谢谢
3、关于QTableView和QTableWidget
      设计一个可编辑的表格,表格支持每个单元格都可以自定义编辑器,并不是整行、整列的定义。
    我的做法是自定义一个类来保存行、列、编辑器的信息,并在对应delegate的createEditor函数中遍历这个信息表,查询到则生成自定义编辑器。
    还有一种做法是用QTableWidget,可以直接setCellWidget。我没这么做的原因是希望编辑器在使用完毕后就被销毁,不要占用资源。而且直接setCellWidget出来的表格似乎也不好看。
    不知道我的做法是否合理,谢谢
4、关于自定义软键盘。
    由于开发对象没有windows键盘,那么只好为QLineEdit建立软键盘,动态的用signals、slots绑定。我的做法是在每个lineEdit的focusInEvent中和软键盘建立连接。为了让lineEdit失去焦点仍然光标闪烁,俺用了傻办法:在焦点交给软键盘,再给lineEdit发送一个focusInEvent。
    不知道这样的解决方式是否合理,谢谢!
离线bienew

只看该作者 2楼 发表于: 2007-08-30
受益匪浅,谢谢!
离线pfyang
只看该作者 1楼 发表于: 2007-08-29
本人也是刚学Qt不久,还比较菜,提一些意见,如果不对,还望大家批评指教:)。
1.我觉得这样做没什么不合理的地方,如果吹毛求屁点的话,QKeyEvent类的实例最好在stack内存块中分配,不要在heap内存分配,以防memory leak。
2.对QFont类还不太了解:(。
3.用QTableView和用QTableWidget本质上是一样的,我觉得使用QTableWidget已经能满足大部分应用的需要,不需要用到它的父类QTableView.
就楼主说的两种方法,我觉得第一种方法还是可取的,只不过用一个类来保存行列编辑器的信息,然后在createEdit函数遍历信息链表有点烦琐,有点杀鸡用牛刀的感觉,用一个枚举类型来表示你所要用到的编辑器就可以了。举个简单的例子吧(贪简便,直接用QTableWidget了):

MyTableWidget类的声明:

class MyTableWidget : public QTableWidget
{
public:
  enum EditType{LineEdit=10,TextEdit,SpinBox,ComboBox,CheckBox};
    MyTableWidget(QWidget *parent=0);
    void addWidgetItem(int row,int col,EditType type);
    QTableWidgetItem * itemFromIndex ( const QModelIndex & index ) const ;
};

Q_DECLARE_METATYPE(MyTableWidget::EditType)


MyTableWidget类的实现:

MyTableWidget::MyTableWidget(QWidget * parent):QTableWidget(parent)
{
    setItemDelegate(new MyDelegate(this));
}
void MyTableWidget::addWidgetItem(int row,int col,MyTableWidget::EditType type)
{
    QTableWidgetItem * item=new QTableWidgetItem();
    item->setData(Qt::UserRole,type);
    setItem(row,col,item);
    openPersistentEditor(item);//是否一直打开编辑器视情况而定

}

QTableWidgetItem * MyTableWidget::itemFromIndex(const QModelIndex & index)const
{
    return QTableWidget::itemFromIndex(index);
}


MyDelegate类的声明:

class MyDelegate:public QItemDelegate
{
public:
    MyDelegate(QWidget *parent=0) : QItemDelegate(parent){};
    QWidget * createEditor(QWidget * parent,const QStyleOptionViewItem & option,const  QModelIndex & index)const;
};

MyDelegate类的实现:
QWidget * MyDelegate::createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index)const
{
    MyTableWidget * myWidget=static_cast<MyTableWidget *>(this->parent());
                      if(myWidget==0)
                                          return 0;
    QTableWidgetItem *item=myWidget->itemFromIndex(index);
    if(item==0)
        return 0;
    MyTableWidget::EditType type=(MyTableWidget::EditType)qvariant_cast<int>(item->data(Qt::UserRole));
    switch(type)
    {
    case MyTableWidget::LineEdit :
        return new QLineEdit(parent);
    case MyTableWidget::SpinBox :
        return new QSpinBox(parent);
    case MyTableWidget::CheckBox :
        return new QCheckBox(parent);
    case MyTableWidget::TextEdit :
        return new QTextEdit(parent);
    case MyTableWidget::ComboBox :
        return new QComboBox(parent);
    }
    return 0;
}

把主函数也写一下吧:)
int main(int argc,char *argv[ ])
{
        QApplication app(argc,argv);
          MyTableWidget m;
          m.setColumnCount(2);
          m.setRowCount(2);
          m.addWidgetItem(0,0,MyTableWidget::SpinBox);
          m.addWidgetItem(0,1,MyTableWidget::CheckBox);
          m.addWidgetItem(1,0,MyTableWidget::ComboBox);
          m.addWidgetItem(1,1,MyTableWidget::LineEdit);
          m.show();
          return app.exec();
}
[ 此贴被pfyang在2007-08-29 20:11重新编辑 ]
快速回复
限100 字节
 
上一个 下一个