- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
我遇到了一个很奇怪的问题:QLineEdit
界面中的对象不能通过鼠标点击访问,而是使用Tab
' 他们接收焦点并响应键盘输入。但即使他们有焦点,他们也不会响应点击。更奇怪的是最后添加的 QLineEdit
确实响应点击。
额外的问题:鼠标无法访问的行编辑不显示工具提示。
我正在使用 Common Lisp 的 qtools构建接口(interface),所以我将不得不做一些解释它是如何工作的。简而言之,我在循环中逐个添加行编辑,所有这些都以相同的方式创建并添加到 QGridLayout
.
更新 :请参阅下面的问题的可能来源
参数小部件
参数小部件用于表示一个参数输入。每个参数都有一个名称、值和单位(度量)。名称和单位显示为标签,值是可编辑的,由 QLineEdit
表示
(define-widget parameter-widget (QWidget)
((parameter :initarg :parameter)))
(define-subwidget (parameter-widget label) (q+:make-qlabel parameter-widget)
(setf (q+:text label) (parameter-base-name parameter)))
(define-subwidget (parameter-widget entry) (q+:make-qlineedit parameter-widget)
(setf (q+:alignment entry) +align-right+)
(setf (q+:text entry) (format nil "~A" (parameter-value parameter)))
(setf (q+:tool-tip entry) (parameter-base-description parameter)))
(define-subwidget (parameter-widget units) (q+:make-qlabel parameter-widget)
(setf (q+:text units) (parameter-units parameter)))
parameter-widget
将发出新信号
parameter-changed
(它被转换为 Qt 的信号“parameterChanged”):
(define-signal (parameter-widget parameter-changed) ())
parameter-changed
:
(define-slot (parameter-widget parameter-changed) ((new-text string))
(declare (connected entry (text-changed string)))
(handler-case
(let ((new-number (parse-number new-text)))
(setf (parameter-value parameter) new-number)
(signal! parameter-widget (parameter-changed)))
(error nil)))
parameter
类型的对象自动构造小部件。 (工厂方法):
(defmethod make-parameter-ui ((object parameter))
(make-instance 'parameter-widget :parameter object))
parameter-container
中多个单个参数的标签(见下文):
(defmethod add-to-grid ((widget parameter-widget) grid row column)
(with-slots (label entry units) widget
(q+:add-widget grid label row column 1 1)
(q+:add-widget grid entry row (1+ column) 1 1)
(q+:add-widget grid units row (+ column 2) 1 1)))
parameter-widget
就其本身而言 - 一切都很好。但大多数时候我需要
parameter-container
形式的多个参数:
(define-widget parameter-container-widget (QWidget)
((parameter-container :initarg :parameter-container)))
parameter-changed
来自所有 child
parameter
's 并为容器重新发出它
(define-slot (parameter-container-widget parameter-changed) ()
(format t "~&Re-emitting the signal...~%")
(signal! parameter-container-widget (parameter-changed)))
layout
是
QGridLayout
把所有个人
parameter-widget
的所有
parameter
-
parameter-container
的 child .它所做的一切:
parameter-widget
对于每个 layout
逐行parameter-changed
到上面定义的插槽。 (define-subwidget (parameter-container-widget layout)
(q+:make-qgridlayout parameter-container-widget)
(loop for p in (parameter-container-children parameter-container)
for row from 0
do (let ((parameter-widget (make-parameter-ui p)))
(setf (q+:parent parameter-widget) parameter-container-widget)
(add-to-grid parameter-widget layout row 0)
(connect! parameter-widget (parameter-changed)
parameter-container-widget
(parameter-changed)))))
parameter-widget
进行统一处理和
parameter-container
:
(defmethod add-to-grid ((widget parameter-container-widget) grid row column)
(q+:add-widget grid widget row column 1 1))
(defmethod make-parameter-ui ((object parameter-container))
(make-instance 'parameter-container-widget :parameter-container object))
(ql:quickload '(:qtools :qtcore :qtgui))
(defpackage :qtexample
(:use #:cl+qt))
(in-package qtexample)
(in-readtable :qtools)
(defclass parameter ()
((name :initarg :name :accessor parameter-name)
(value :initarg :value :accessor parameter-value)
(units :initarg :units :accessor parameter-units)))
(defun parameter (name value units)
(make-instance 'parameter
:name name
:value value
:units units))
(defvar *mass* (parameter "mass" 1d0 "kg"))
(defvar *velocity* (parameter "velocity" 0.5d0 "m/s"))
(defvar *temperature* (parameter "temperature" 300d0 "K"))
(defvar *pressure* (parameter "pressure" 1d5 "Pa"))
(define-widget parameter-widget (QWidget)
((parameter
:initarg :parameter
:accessor parameter-widget-parameter)))
(define-subwidget (parameter-widget label)
(q+:make-qlabel parameter-widget)
(setf (q+:text label) (parameter-name parameter)))
(defmethod make-ui ((object parameter))
(make-instance 'parameter-widget :parameter object))
(defconstant +align-right+ 2)
(define-subwidget (parameter-widget entry)
(q+:make-qlineedit parameter-widget)
(setf (q+:alignment entry) +align-right+)
(setf (q+:text entry) (format nil "~A" (parameter-value parameter))))
(define-subwidget (parameter-widget units)
(q+:make-qlabel parameter-widget)
(setf (q+:text units) (parameter-units parameter)))
(define-signal (parameter-widget parameter-changed) ())
(define-slot (parameter-widget entry) ((new-text string))
(declare (connected entry (text-changed string)))
(format t "~&Parameter has changed~%")
(handler-case
(let ((new-number (parse-number:parse-number new-text)))
(setf (parameter-value parameter) new-number)
(signal! parameter-widget (parameter-changed)))
(error nil)))
(defmethod add-to-grid ((widget parameter-widget) grid row column)
(with-slots (label entry units) widget
(q+:add-widget grid label row column 1 1)
(q+:add-widget grid entry row (1+ column) 1 1)
(q+:add-widget grid units row (+ column 2) 1 1)
(list (1+ row) (+ column 3))))
(define-widget parameter-widget-window (QWidget)
((parameter :initarg :parameter)))
(define-subwidget (parameter-widget-window parameter-widget)
(make-ui parameter))
(define-subwidget (parameter-widget-window grid)
(q+:make-qgridlayout parameter-widget-window)
(add-to-grid parameter-widget grid 0 0))
(defun parameter-example (parameter)
(with-main-window
(window (make-instance 'parameter-widget-window
:parameter parameter))))
(define-widget parameter-container-widget (QWidget)
((parameter-container
:initarg :parameter-container
:accessor parameter-container-widget-parameter-container)))
(defmethod make-ui ((object list))
(make-instance 'parameter-container-widget :parameter-container object))
(define-slot (parameter-container-widget parameter-changed) ()
(format t "~&Re-emitting the signal...~%")
(signal! parameter-container-widget (parameter-changed)))
(define-subwidget (parameter-container-widget layout)
(q+:make-qgridlayout parameter-container-widget)
(let* ((parameter-widgets (loop for p in parameter-container
collect (make-ui p))))
(loop for p in parameter-widgets
for row from 0
do (progn
(setf (q+:parent p) parameter-container-widget)
(add-to-grid p layout row 0)
(connect! p
(parameter-changed)
parameter-container-widget
(parameter-changed))))))
(define-widget parameter-container-widget-window (QWidget)
((parameter-container :initarg :parameter-container)))
(define-subwidget (parameter-container-widget-window container-widget)
(make-ui parameter-container)
(setf (q+:parent container-widget) parameter-container-widget-window))
(define-slot (parameter-container-widget-window parameter-changed) ()
(declare (connected container-widget (parameter-changed)))
(format t "~&Got parameter changed~%"))
(defmethod add-to-grid ((widget parameter-container-widget) grid row column)
(q+:add-widget grid widget row column))
(defun example-parameter-container (parameter-container)
(with-main-window
(window (make-instance 'parameter-container-widget-window
:parameter-container parameter-container))))
;; to run:
(example-parameter-container (list *mass* *velocity*))
(setf (q+:parent p) parameter-container-widget)
p
(在子小部件列表中)为
parameter-container-widget
.如果注释了此行,则一切正常。
p
的子小部件(包括
entry
,
QLineEdit
的一个实例)稍后被添加到网格中,但不是
p
本身!在某种程度上,
parameter-widget
不是一个合适的小部件:它只是其他小部件的集合,具有如何将它们添加到容器中的规则。但它需要在能够接收和发送信号的意义上充当小部件。
最佳答案
在@KubaOber 和@Shinmera 提出建议后,我设法解决了这个问题。我在这里发布修复以供将来引用。
初步没有改变(除了,我忘了添加 :PARSE-NUMBER
系统):
(ql:quickload '(:qtools :qtcore :qtgui :parse-number))
(defpackage :qtexample
(:use #:cl+qt))
(in-package qtexample)
(in-readtable :qtools)
(defclass parameter ()
((name :initarg :name :accessor parameter-name)
(value :initarg :value :accessor parameter-value)
(units :initarg :units :accessor parameter-units)))
(defun parameter (name value units)
(make-instance 'parameter
:name name
:value value
:units units))
(defvar *mass* (parameter "mass" 1d0 "kg"))
(defvar *velocity* (parameter "velocity" 0.5d0 "m/s"))
(defvar *temperature* (parameter "temperature" 300d0 "K"))
(defvar *pressure* (parameter "pressure" 1d5 "Pa"))
PARAMETER-WIDGET
不是真正的小部件,而只是其他小部件的容器(并且它本身不能添加到适当的小部件容器中 - 否则标签的对齐将消失 - 参见
ADD-TO-GRID
方法)但它需要能够接收和发送信号,继承自
QObject
而不是
QWidget
.现在所有子小部件都只是其中的普通类槽,而不是由
(DEFINE-SUBWIDGET ...)
定义。 .请注意,没有为任何子小部件提供父级:将这些小部件添加到容器小部件时将分配父属性。
(define-widget parameter-widget (QObject)
((parameter
:initarg :parameter
:accessor parameter-widget-parameter)
(label :initform (q+:make-qlabel))
(entry :initform (q+:make-qlineedit))
(units :initform (q+:make-qlabel))))
INITIALIZE-INSTANCE :AFTER
方法:
(defconstant +align-right+ 2)
(defmethod initialize-instance :after ((object parameter-widget) &key)
(with-slots (parameter label entry units) object
(setf (q+:text label) (parameter-name parameter))
(setf (q+:text entry) (format nil "~A" (parameter-value parameter)))
(setf (q+:alignment entry) +align-right+)
(setf (q+:text units) (parameter-units parameter))))
(defmethod make-ui ((object parameter))
(make-instance 'parameter-widget :parameter object))
(define-signal (parameter-widget parameter-changed) ())
(define-slot (parameter-widget entry) ((new-text string))
(declare (connected entry (text-changed string)))
(format t "~&Parameter has changed~%")
(handler-case
(let ((new-number (parse-number:parse-number new-text)))
(setf (parameter-value parameter) new-number)
(signal! parameter-widget (parameter-changed)))
(error nil)))
(defmethod add-to-grid ((widget parameter-widget) grid row column)
(with-slots (label entry units) widget
(q+:add-widget grid label row column 1 1)
(q+:add-widget grid entry row (1+ column) 1 1)
(q+:add-widget grid units row (+ column 2) 1 1)
(list (1+ row) (+ column 3))))
PARAMETER-WIDGET
不再是一个小部件,所以它被添加为一个类槽。
(define-widget parameter-widget-window (QWidget)
((parameter :initarg :parameter)
(parameter-widget)))
(define-subwidget (parameter-widget-window grid)
(q+:make-qgridlayout parameter-widget-window))
PARAMETER-WIDGET
网格中的组件已从此定义中移出。原因:插槽
PARAMETER-WIDGET
在这一点上是不受约束的。它确实被绑定(bind)到
INITIALIZE-INSTANCE :AFTER
方法以及将所有组件添加到网格的位置:
(defmethod initialize-instance :after ((object parameter-widget-window) &key)
(with-slots (parameter parameter-widget grid) object
(setf parameter-widget (make-ui parameter))
(setf (q+:parent parameter-widget) object)
(add-to-grid parameter-widget grid 0 0)))
(defun parameter-example (parameter)
(with-main-window
(window (make-instance 'parameter-widget-window
:parameter parameter))))
(parameter-example *mass*)
PARAMETER-CONTAINER-WIDGET
是一个合适的小部件。它的定义没有改变:
(define-widget parameter-container-widget (QWidget)
((parameter-container
:initarg :parameter-container
:accessor parameter-container-widget-parameter-container)))
(defmethod make-ui ((object list))
(make-instance 'parameter-container-widget :parameter-container object))
(define-slot (parameter-container-widget parameter-changed) ()
(format t "~&Re-emitting the signal...~%")
(signal! parameter-container-widget (parameter-changed)))
LAYOUT
定义也不会改变。但是现在设置
p
的父属性是安全的。 (
PARAMETER-WIDGET
) 到
PARAMETER-WIDGET-CONTAINER
,所以当容器被销毁时它会被销毁。
(define-subwidget (parameter-container-widget layout)
(q+:make-qgridlayout parameter-container-widget)
(let* ((parameter-widgets (loop for p in parameter-container
collect (make-ui p))))
(loop for p in parameter-widgets
for row from 0
do (progn
(add-to-grid p layout row 0)
(let ((pp p))
(setf (q+:parent pp) parameter-container-widget))
(connect! p
(parameter-changed)
parameter-container-widget
(parameter-changed))))))
(defmethod add-to-grid ((widget parameter-container-widget) grid row column)
(q+:add-widget grid widget row column))
(define-widget parameter-container-widget-window (QWidget)
((parameter-container :initarg :parameter-container)))
(define-subwidget (parameter-container-widget-window container-widget)
(make-ui parameter-container)
(setf (q+:parent container-widget) parameter-container-widget-window))
(define-slot (parameter-container-widget-window parameter-changed) ()
(declare (connected container-widget (parameter-changed)))
(format t "~&Got parameter changed~%"))
(defun example-parameter-container (parameter-container)
(with-main-window
(window (make-instance 'parameter-container-widget-window
:parameter-container parameter-container))))
(example-parameter-container (list *mass* *velociy*))
(example-parameter-container (list *mass* *velocity* (list *temperature* *pressure*)))
ADD-TO-GRID
对于
PARAMETER-CONTAINER-WIDGET
需要更复杂一些,但这是一个不同的故事。
关于Qt(通过 Common Lisp 的 qtools): QLineEdit does not activate on click but receives focus on TAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944839/
我正在使用 Qt 语言学家翻译一个 ui 文件。我使用 lupdate 获取了它的 ts 文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但我从它的教程中发现我似乎必须将 tr() 添加到
我想在 Qt Creator 中创建下面的简单控制台应用程序: #include int main(int argc, char* argv[]) { std::cout #include
我想将 libQtGui.so.4 libQtNetwork.so.4 和 libQtCore.so.4 包含在与我的应用程序所在的目录相同的目录中。我如何让 Qt 理解这一点? y 目的是拥有一个使
我有一个充满 QPushButtons 和 QLabels 以及各种其他有趣的 QWidget 的窗口,所有这些都使用各种 QLayout 对象动态布局...而我想做的是偶尔制作一些这些小部件变得不可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
我想知道 Qt 是否将下面代码的“版本 1”之类的东西放在堆上?在版本 1 中,Qt 会将 dirStuff 放在堆栈上还是堆上?我问是因为我有一种感觉,Java 将所有数据结构放在堆上......不
这个问题是关于 Qt Installer Framework 2.0 版的。 在这一点上,使用 Qt 安装程序框架的人都知道,如果不进行自定义,您根本无法通过安装程序覆盖现有安装。这样做显然是为了解决
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
因为我在我的计算机上安装了 Qt 4.8.4 和 Qt 5.1,所以我遇到了问题。 当只有 Qt 4.8.4 存在时,一切都很好。 当我添加 Qt 5.1 时,这个工作正常,但 Qt 4.8.4 给了
我无法在我的 Ubuntu 12 中安装更多软件包。我尝试了 apt-get install -f ,以及许多其他类似的技巧,但在找到解决方案方面没有进展。 这是属于 Qt 的损坏包: 以下包具有未满
我正在尝试使用 Virtual Box 中的 Ubuntu 机器复制我们目前在物理 Ubuntu 服务器上运行的应用程序。它是一个 QT 应用程序,但在服务器上我们使用 NPM 的 pm2 运行它。安
问题: Qt Creator 是用 Qt Creator 构建的吗? 同样,Qt Designer 是用 Qt Designer 构建的吗? 顺便说一句,为什么有两个 Qt IDE?他们是竞争对手吗?
当我使用 QWidget设计用户界面时,我总是对它的大小属性有点困惑。有size policy , geometry和 hintSize . 我只知道size policy之间的关系和 hintSiz
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我想知道是否有一种很好的方法可以让用户像 LabView 一样创建节点图(有限制)。 像这样的东西: 我见过http://www.pyqtgraph.org/ ,这似乎有类似的东西,我确实打算使用 P
在 Qt 中是否有一种跨平台的方式来获得用户喜欢的固定宽度和比例字体? 例如,在 cocoa 中,有 NSFont *proportional = [NSFont userFontOfSize:12.
我想使用 Qt 和 C++ 制作这样的交互式图表:http://jsxgraph.uni-bayreuth.de/wiki/index.php/Cubic_spline_interpolation 关
我正在编写一个嵌入式设备屏幕的模拟(其中包含主 QWidget 顶部的自定义小部件),虽然屏幕的原始尺寸是 800x600,但我希望能够按比例放大和缩小它拖动窗口的角。如果不使用网格布局和担架(不会向
在下面的示例中,我是否必须从堆中删除对象?如果是的话,怎么办? #include #include #include #include #include int main(int argc,
来自 Web 开发背景,我现在进入 QT 应用程序开发。 使用 QFonts 我已经看到我显然只有两个选择,在 QT 中定义字体大小;按像素大小或点大小。 在制作网页布局时,我习惯于以相对方式定义所有
我是一名优秀的程序员,十分优秀!