37,720
社区成员
发帖
与我相关
我的任务
分享
//Qt代码
QList<QPushButton *> btn = this->findChildren<QPushButton *>();
foreach (QPushButton * b, btn) {
connect(b, SIGNAL(clicked()), this, SLOT(btn_clicked()));
}
btn = []
btn = self.findChildren(QPushButton)
b = QPushButton()
for b in btn:
b.connect(self,SIGNAL("clicked()"),self.btn_clicked)
void frmInput::focusChanged(QWidget *oldWidget, QWidget *nowWidget)
{
//qDebug() << "oldWidget:" << oldWidget << " nowWidget:" << nowWidget;
if (nowWidget != 0 && !this->isAncestorOf(nowWidget)) {
//在Qt5和linux系统中(嵌入式linux除外),当输入法面板关闭时,焦点会变成无,然后焦点会再次移到焦点控件处
//这样导致输入法面板的关闭按钮不起作用,关闭后马上有控件获取焦点又显示.
//为此,增加判断,当焦点是从有对象转为无对象再转为有对象时不要显示.
//这里又要多一个判断,万一首个窗体的第一个焦点就是落在可输入的对象中,则要过滤掉
#ifndef __arm__
if (oldWidget == 0x0 && !isFirst) {
return;
}
#endif
isFirst = false;
if (nowWidget->inherits("QLineEdit")) {
currentLineEdit = (QLineEdit *)nowWidget;
currentEditType = "QLineEdit";
this->setVisible(true);
} else if (nowWidget->inherits("QTextEdit")) {
currentTextEdit = (QTextEdit *)nowWidget;
currentEditType = "QTextEdit";
this->setVisible(true);
} else if (nowWidget->inherits("QPlainTextEdit")) {
currentPlain = (QPlainTextEdit *)nowWidget;
currentEditType = "QPlainTextEdit";
this->setVisible(true);
} else if (nowWidget->inherits("QTextBrowser")) {
currentBrowser = (QTextBrowser *)nowWidget;
currentEditType = "QTextBrowser";
this->setVisible(true);
} else if (nowWidget->inherits("QComboBox")) {
QComboBox *cbox = (QComboBox *)nowWidget;
//只有当下拉选择框处于编辑模式才可以输入
if (cbox->isEditable()) {
currentLineEdit = cbox->lineEdit() ;
currentEditType = "QLineEdit";
this->setVisible(true);
}
} else if (nowWidget->inherits("QSpinBox") ||
nowWidget->inherits("QDoubleSpinBox") ||
nowWidget->inherits("QDateEdit") ||
nowWidget->inherits("QTimeEdit") ||
nowWidget->inherits("QDateTimeEdit")) {
currentWidget = nowWidget;
currentEditType = "QWidget";
this->setVisible(true);
} else {
//需要将输入法切换到最初的原始状态--小写,同时将之前的对象指针置为零
currentWidget = 0;
currentLineEdit = 0;
currentTextEdit = 0;
currentPlain = 0;
currentBrowser = 0;
currentEditType = "";
currentType = "min";
changeType(currentType);
this->setVisible(false);
}
//根据用户选择的输入法位置设置-居中显示-底部填充-显示在输入框正下方
if (currentPosition == "center") {
QPoint pos = QPoint(deskWidth / 2 - frmWidth / 2, deskHeight / 2 - frmHeight / 2);
this->setGeometry(pos.x(), pos.y(), frmWidth, frmHeight);
} else if (currentPosition == "bottom") {
this->setGeometry(0, deskHeight - frmHeight, deskWidth, frmHeight);
} else if (currentPosition == "control") {
QRect rect = nowWidget->rect();
QPoint pos = QPoint(rect.left(), rect.bottom() + 2);
pos = nowWidget->mapToGlobal(pos);
this->setGeometry(pos.x(), pos.y(), frmWidth, frmHeight);
}
}
}
#修改的
def focusChanged(self,oldWidget,nowWidget):
if (nowWidget != 0 & self.isAncestorOf(nowWidget)==False):
#在Qt5和linux系统中(嵌入式linux除外),当输入法面板关闭时,焦点会变成无,然后焦点会再次移到焦点控件处
#这样导致输入法面板的关闭按钮不起作用,关闭后马上有控件获取焦点又显示.
#为此,增加判断,当焦点是从有对象转为无对象再转为有对象时不要显示.
#这里又要多一个判断,万一首个窗体的第一个焦点就是落在可输入的对象中,则要过滤掉
#ifndef __arm__
if (oldWidget == 0x0 & self.isFirst==False):
return
#endif
self.isFirst = False
if (nowWidget.inherits("QLineEdit")):
self.currentLineEdit = QLineEdit(nowWidget)
self.currentEditType = "QLineEdit"
self.setVisible(True);
elif (nowWidget.inherits("QTextEdit")):
self.currentTextEdit = QTextEdit(nowWidget)
self.currentEditType = "QTextEdit"
self.setVisible(True)
elif (nowWidget.inherits("QPlainTextEdit")):
self.currentPlain = QPlainTextEdit(nowWidget)
self.currentEditType = "QPlainTextEdit"
self.setVisible(True)
elif (nowWidget.inherits("QTextBrowser")):
self.currentBrowser = QTextBrowser(nowWidget)
self.currentEditType = "QTextBrowser"
self.setVisible(True)
elif (nowWidget.inherits("QComboBox")):
cbox = QComboBox(nowWidget)
#只有当下拉选择框处于编辑模式才可以输入
if (cbox.isEditable()):
self.currentLineEdit = cbox.lineEdit()
self.currentEditType = "QLineEdit"
self.setVisible(True)
elif (nowWidget.inherits("QSpinBox") |
nowWidget.inherits("QDoubleSpinBox") |
nowWidget.inherits("QDateEdit") |
nowWidget.inherits("QTimeEdit") |
nowWidget.inherits("QDateTimeEdit")):
self.currentWidget = nowWidget
self.currentEditType = "QWidget"
self.setVisible(True)
else:
#需要将输入法切换到最初的原始状态--小写,同时将之前的对象指针置为零
self.currentWidget = 0
self.currentLineEdit = 0
self.currentTextEdit = 0
self.currentPlain = 0
self.currentBrowser = 0
self.currentEditType = ""
self.currentType = "min"
self.changeType(self.currentType)
self.setVisible(False)
#根据用户选择的输入法位置设置-居中显示-底部填充-显示在输入框正下方
if (self.currentPosition == "center"):
pos = QPoint(deskWidth / 2 - frmWidth / 2, deskHeight / 2 - frmHeight / 2)
self.setGeometry(pos.x(), pos.y(), frmWidth, frmHeight)
elif (self.currentPosition == "bottom"):
self.setGeometry(0, deskHeight - frmHeight, deskWidth, frmHeight)
elif (self.currentPosition == "control"):
rect = nowWidget.rect()
pos = QPoint(rect.left(), rect.bottom() + 2)
pos = nowWidget.mapToGlobal(pos)
self.setGeometry(pos.x(), pos.y(), frmWidth, frmHeight)
bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
if (object == target && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab) {
// Special tab handling
return true;
} else
return false;
}
return false;
}
上面第三行的"if (object == target && event->type() == QEvent::KeyPress)"就保证了event是一个QKeyEvent, event.key()应该没问题.
3. isAncestorOf是QWidget的一个方法, 每个widget的子类都继承了这个方法.
inherits是QObject中定义的方法, 更是每个QT中的对象都有的.
In [84]: win1 = QMainWindow()
In [85]: win1.isAncestorOf?
Docstring: QWidget.isAncestorOf(QWidget) -> bool
Type: builtin_function_or_method
In [86]: pb = QPushButton(win1)
In [87]: pb.isAncestorOf?
Docstring: QWidget.isAncestorOf(QWidget) -> bool
Type: builtin_function_or_method
In [88]: pb.inherits(QWidget)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-88-17f2b78798b1> in <module>()
----> 1 pb.inherits(QWidget)
TypeError: QObject.inherits(str): argument 1 has unexpected type 'PyQt4.QtCore.pyqtWrapperType'
In [89]: pb.inherits("QWidget")
Out[89]: True
In [90]: pb.inherits("QList")
Out[90]: False
In [91]: win1.isAncestorOf(pb)
Out[91]: True
In [92]: pb.isAncestorOf(win1)
Out[92]: False
QObject.connect(qApp, SIGNAL("focusChanged(QWidget *, QWidget *)"), self.focusChanged)
def focusChanged(self,oldWidget,nowWidget):
if (nowWidget != 0 & self.isAncestorOf(nowWidget)==False):
self.isFirst = False
if (nowWidget.inherits("QLineEdit")):
self.currentLineEdit = QLineEdit(nowWidget)
self.currentEditType = "QLineEdit"
self.setVisible(True);
…………
pyqt中没有isAncestorOf 和inherits这两种用法,不知道该怎么改。
self.ui.btna.clicked.connect(self.btn_clicked)
可以, 在循环中为什么不用相同的结构:
for b in btn:
b.clicked.connect(self.btn_clicked)
2. python没有type, 只有"duck typing". QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
的作用是声明"event实际上是QKeyEvent, 把它当QKeyEvent用". 在python中不用这个, 如果event是QKeyEvent, 你直接把它当QKeyEvent用就是了.
if (event.key() == Qt::Key_Space) {
}
3. http://stackoverflow.com/questions/7377397/pyqt-window-focus-events-not-called:
QObject.connect(app, SIGNAL("focusChanged(QWidget *, QWidget *)"), changedFocusSlot)
1, 2没有完整代码,纯属猜测. 3的代码试过了.