【问题标题】:How to add hyperlinks in Qt without QLabel?如何在没有 QLabel 的情况下在 Qt 中添加超链接?
【发布时间】:2017-08-22 00:08:59
【问题描述】:

我在 QWidget 中嵌套了一些标签和布局,以构建侧边栏的一部分。每个 QWidget 都有自己的部分,其中一个组件目前如下所示:

据我了解,您只能使用 QLabel 设置超链接,但我试图让白线之间的整个区域可点击。这包括图标和空格。有什么办法可以做到这一点?

这被标记为与我所要求的相反的重复,所以我想重申我正在尝试实现一个超链接没有 QLabel。

【问题讨论】:

  • 对不起,我的错,这里是凌晨 3 点。我看到了 QLabel 和超链接,就像“哦,不要再这样了”:D
  • @dtech 不用担心!!它发生了:)
  • 在鼠标点击处理程序中尝试QDesktopServices::openUrl(yourURL)

标签: c++ qt hyperlink


【解决方案1】:

您可以轻松地让小部件在点击时打开链接:

class Link : public QWidget {
  Q_OBJECT
  public:
  Link(QUrl url, QWidget p = nullptr) : QWidget(p), _url(url) {}
  QUrl _url;
  void mouseReleaseEvent(QMouseEvent *) { QDesktopServices::openUrl(_url); }
}

您可以避免任何额外的信号和连接,并让每个链接小部件在内部存储自己的链接,网址可以在构建时设置并随时更改。不使用信号和插槽也可以更轻松地更改链接,而无需断开之前的连接。

IMO 寻求信号和插槽解决方案仅在您想要不同的任意行为时才合理。在这种情况下,您总是希望打开一个特定的链接,因此您不妨对其进行硬编码并寻求更简单、计算效率更高的解决方案。

【讨论】:

  • 这非常有效!不知道你可以这样使用 mouseReleaseEvent 。谢谢:)
【解决方案2】:

我将手动捕获 clicked() 的信号并使用桌面服务在代码中打开 url。

bool QDesktopServices::openUrl ( const QUrl & url ) [static]

在适合用户桌面环境的 Web 浏览器中打开给定的 url,如果成功则返回 true;否则返回 false。

http://doc.qt.io/qt-4.8/signalsandslots.html

使用这种类型的语法,或者在设计器中,您还可以将信号连接到插槽。

connect(widgetThatRepresentsURL, SIGNAL(clicked()),
    handlerThatWillOpenTheURL, SLOT(clicked_on_url()));

对于没有为单击(或您感兴趣的任何事件)设置信号的小部件,您可以对相关小部件进行子类化并重新实现...

void QWidget::mousePressEvent ( QMouseEvent * event )   [virtual protected]

专门用于创建信号,有emit。我过去用过这个,如下所示

void Cell::focusInEvent(QFocusEvent *e)
{
  emit focus(this, true);
  QLineEdit::focusInEvent(e);
}

在标题中包含以下内容

signals:
  void focus(Cell *, bool);

【讨论】:

  • QWidget中没有点击信号。
  • 您可以创建一个或重新实现事件处理程序。我会为你补充答案。
猜你喜欢
  • 2011-10-29
  • 2012-10-05
  • 2020-06-24
  • 2022-07-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多