我使用 QtDesigner 创建了一个对话框。对话框中有一个QLineEdit
带有一些默认内容的对象。当对话框初始化并且焦点转到 时QLineEdit
,我希望自动选择默认内容,因此一旦用户开始编写,以前的内容将被覆盖。
编辑:
在构造函数中:
dialog->accept();
和
connect( dialog, SIGNAL(accepted()), QlineObj, SLOT( selectAll() ) );
我使用 QtDesigner 创建了一个对话框。对话框中有一个QLineEdit
带有一些默认内容的对象。当对话框初始化并且焦点转到 时QLineEdit
,我希望自动选择默认内容,因此一旦用户开始编写,以前的内容将被覆盖。
编辑:
在构造函数中:
dialog->accept();
和
connect( dialog, SIGNAL(accepted()), QlineObj, SLOT( selectAll() ) );
这是一个较老的问题,但尽管如此,我最终还是在这里寻找解决这个确切问题的方法。可以通过以下方式解决:
创建一个派生自QLineEdit
并覆盖focusInEvent
标头中的类:
void focusInEvent(QFocusEvent *event) override;
然后像这样实现它:
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
// First let the base class process the event
QLineEdit::focusInEvent(event);
// Then select the text by a single shot timer, so that everything will
// be processed before (calling selectAll() directly won't work)
QTimer::singleShot(0, this, &QLineEdit::selectAll);
}
以防万一其他人想知道如何做到这一点;-)
称呼
lineEdit->selectAll();
设置默认文本后。(也许在对话框构造函数中。)
有一种更简单的方法可以获得几乎相同的行为,即使用 setPlaceholderText() 而不是 setText() 设置默认内容。这会将默认内容显示为灰色,并且一旦 QLineEdit 获得焦点,它就会消失。
您可以使用QApplication::focusChanged
withQTimer::singleShot
来选择更改焦点上的所有文本。
通常你QApplication
在 main 中声明,所以QObject::connect
在那里使用,例如:
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
My_Main_Window w();
QObject::connect(&a, SIGNAL(focusChanged(QWidget*, QWidget*)),
&w, SLOT(my_focus_changed_slot(QWidget*, QWidget*)));
w.show();
return a.exec();
}
记得在My_Main_Window
课堂上设置公共位置:
public slots:
void my_focus_changed_slot(QWidget*, QWidget*);
然后在您的定义中my_focus_changed_slot
,检查第二个QWidget*
(指向新聚焦的小部件)是否与QLineEdit
您希望选择所有的相同,并使用QTimer::singleShot
以便调用事件循环,然后QLineEdit
立即selectAll
调用插槽之后,例如
void My_Main_Window::focus_changed(QWidget*, QWidget* new_widget) {
if (new_widget == my_lineedit) {
QTimer::singleShot(0, my_lineedit, &QLineEdit::selectAll);
}
}
wheremy_lineedit
是指向 a 的指针,QLineEdit
并且是My_Main_Window
类的一部分。