在 qt 中创建一个可切换的文本小部件

Creating a toggleable text widget in qt

我不想使用传统的复选框,而是想使用更易于阅读的格式来显示我的选项。为了准确展示我想要的东西,我用我非常熟悉的语言实现了它。

是否可以使用 Qt 重新创建以下示例?如果是这样,我想要一些关于如何做的指示,对我来说如何以非 hacky 方式做这件事并不明显。

var $ = document.querySelector.bind(document);

var toggle = $('.toggle');
var first = toggle.firstChild;
var last = toggle.lastChild;
last.style.display = "none";

function hide(el) {
  el.style.display = "none";
}

function show(el) {
  el.style.display = "inherit";
}

var current = false;
toggle.addEventListener("click", function () {
  current = !current;
  if (!current) {
    hide(last);
    show(first);
  } else {
    show(last);
    hide(first);
  }
});
span.toggle {
  border-bottom: 1px dashed;
}

span.toggle:hover {
  cursor: pointer;
}
<p class="example">I will start <span class="toggle"><span>minimized</span><span>maximized</span></span>!</p>

您可以通过连接到 QLabellinkActivated 信号来实现此目的。 QLabel 可以包含富文本,如 URL,单击时会发出 linkActivated 信号。下面包含一个最小示例。

在此示例中,我们创建了一个 QLabel,其中包含一些包含可点击文本周围锚点的富文本(我将锚点称为 #toggle,但它可以是任何内容)。单击时,它会触发 linkclicked 方法,该方法根据锚点更改文本。所以我们在两个锚之间交换,#toggle#toggle2,同时也改变文本。

from PySide import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)
win = QtGui.QMainWindow()
label = QtGui.QLabel('I will start <a href="#toggle">minimized</a>!')
def linkclicked(url):
    if url == '#toggle':
        label.setText('I will start <a href="#toggle2">maximized</a>!')
    else:        
        label.setText('I will start <a href="#toggle">minimized</a>!')

label.linkActivated.connect(linkclicked)
win.setCentralWidget(label)
win.show()
sys.exit(app.exec_())

这显然是一个最小的例子。您可以将当前状态存储在一个布尔变量中,并根据它切换文本(不需要多个锚点名称)或其他所有东西!希望这能为您提供一个可以扩展的基本概念。